我有一个连接在一个表上的查询。
我完全理解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
答案 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
出错就应该有效。