不理解 ANSI SQL 内部连接语法中"ON"子句后面的"AND"



我有一个在一个表上连接的查询。我完全理解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

这个查询试图建立一个特定公司transaction的运行和。

基本上,它获取该公司从2010-08-01开始的transactions_tbl中的每条记录,将其与同一公司的同一表中比该记录早(并且仍然晚于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

查询中的"内部连接"相当于两个表的叉乘,然后对结果进行选择,where子句是内部连接on部分的谓词。

出于某种原因需要显式使用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是错误的,就应该可以工作。

最新更新