2

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

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

于 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 回答