不理解ANSI SQL内部联接语法中“ON”子句后面的“AND”

时间:2013-04-25 15:10:34

标签: sql oracle postgresql

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

查询中的“内连接”等效于两个表的叉积,然后选择结果,其中where子句是内连接的ON部分中的谓词。

答案 2 :(得分: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出错就应该有效。