我有一个在一个表上连接的查询。我完全理解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
是错误的,就应该可以工作。