2

1 つのテーブルに結合するクエリがあります。company_no の内部結合については完全に理解しています。=そして、サイン付きの別の結合条件があったとしても、私は理解したでしょう. しかし、ON 句の直後にある以上は何AND ts.trans_date >= mtd.trans_dateですか? これが何をしているのか理解できません。

SELECT  ts.trans_date, ts.company_no, ts.transactions, ts.mtd_transactions, SUM(mtd.transactions) AS tabulated_mtd_transactions
FROM    transactions_tbl ts
    INNER JOIN transactions_tbl mtd
    ON  ts.company_no = mtd.company_no
    AND ts.trans_date >= mtd.trans_date
        WHERE   ts.company_no = 1080 
                    AND ts.trans_date >= '2010-08-01'
            AND mtd.trans_date >= '2010-08-01'
GROUP BY    ts.trans_date, ts.company_no, ts.transactions, ts.mtd_transactions
ORDER BY    ts.trans_date
4

3 に答える 3

2

このクエリはtransaction、特定の会社の累計を作成しようとします。

基本的にはtransactions_tbl、その会社の で始まるすべてのレコードを取得し、同じ会社の同じテーブル内の2010-08-01それより前 (および より後) のすべてのレコードに結合し、それらのレコードの合計を求めます。2010-08-01

PostgreSQL 8.4 および Oracle 8i 以降、これを行うためのより効率的な方法があります。

SELECT  *,
        SUM(transactions) OVER (PARTITION BY company_no ORDER BY trans_date)
FROM    transactions_tbl
WHERE   ts.company_no = 1080
        AND ts.trans_date >= '2010-08-01'
ORDER BY
        trans_date
于 2013-04-25T15:13:28.473 に答える
1

クエリの「内部結合」は、2 つのテーブルのクロス積と、内部結合の ON セクションの述語である where 句を使用した結果の選択に相当します。

于 2013-04-27T01:05:53.227 に答える
0

何らかの理由で明示的な INNER JOIN ステートメントを実行する必要がありますか?

SELECT  ts.trans_date, ts.company_no, ts.transactions, ts.mtd_transactions, SUM(mtd.transactions) AS tabulated_mtd_transactions
FROM    transactions_tbl ts, transactions_tbl mtd
WHERE
    ts.company_no = mtd.company_no
    AND ts.trans_date >= mtd.trans_date
    AND ts.company_no = 1080 
    AND ts.trans_date >= '2010-08-01'
    AND mtd.trans_date >= '2010-08-01'
GROUP BY    ts.trans_date, ts.company_no, ts.transactions, ts.mtd_transactions
ORDER BY    ts.trans_date

これは、明示的な INNER JOIN ステートメントの混乱なしに、ステートメントと同じである必要があります。

本気で掃除したいなら…

SELECT  ts.trans_date, ts.company_no, ts.transactions, ts.mtd_transactions, SUM(ts.transactions) AS tabulated_mtd_transactions
FROM    transactions_tbl ts
WHERE ts.company_no = 1080 
AND ts.trans_date >= '2010-08-01'
GROUP BY    ts.trans_date, ts.company_no, ts.transactions, ts.mtd_transactions
ORDER BY    ts.trans_date

ts.trans_date >= mtd.trans_date間違いである限り、それはうまくいくはずだと思います。

于 2013-04-25T15:13:39.397 に答える