2013-04-25 48 views
2

我有一個查詢連接到一個表上。 我完全理解了company_no的內部連接。即使有另一個連接條件,我會理解。但是ON條款AND ts.trans_date >= mtd.trans_date之後的大於或等於什麼?我無法理解這是在做什麼。不理解ANSI SQL內部連接語法中'ON'子句之後的'AND'

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

您的格式可能會讓您感到困惑。我會將WHERE語句放在左邊空白處,因爲它不是FROM或JOIN子句的一部分。 – 2013-05-01 05:26:41

回答

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 
+0

你能解釋一下你的OVER子句是什麼意思嗎? – Doublespeed 2013-04-25 15:25:24

+0

我有點理解你的意思。但是當你提到的時候,'把它加入到同一個公司的同一張表中的所有記錄(並且晚於2010-08-01),並找到這些記錄的總和。「不會那樣導致笛卡爾積。 – Doublespeed 2013-04-25 15:27:28

+0

@ user2081579'SUM(...)OVER(...)'是一個用作*窗口函數*的集合。請參閱[關於窗口函數的PostgreSQL文檔](http://www.postgresql.org/docs/current/static/tutorial-window.html)以瞭解更多信息。 – 2013-04-27 03:20:08

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是一個錯誤。

+1

我正在學習如何使用ANSI語法。我想使用INNER JOIN。 – Doublespeed 2013-04-25 15:15:41

+5

明確的內部連接語句通常是首選的,因爲它們更容易理解,因爲它們更加明確。 – 2013-04-25 15:16:20

+0

@EsotericScreenName我總是發現它們本質上令人困惑,因爲它們採用了基於特定列的合併的簡單概念,並使SQL變得混亂......例如, http://pastebin.com/qZZcqRUV – Brent 2013-04-25 15:30:05

1

查詢中的「內部聯接」相當於兩個表的交叉乘積,然後在內部聯接的ON部分中使用where子句作爲謂詞的結果上進行選擇。