2013-01-22 63 views
0

我正在嘗試爲我的內部客戶進行查詢。我有兩個表ABA存儲整個月的所有銷售交易數據。 B存儲特定部門整個月的所有銷售交易數據(形式略有不同)。篩選SQL加入

結果客戶的需求是從表B中的所有檢查#秒,表A的任何檢查#分別匹配任何檢查#分別在表B中具有的1, 2, or 3一個T_ID值。

注意:在A和B中,支票#都可以有多個條目。

認爲我有查詢權(??),但客戶告訴我「看起來不正確」(具體來說,他說我們正在拉太多表A的記錄)。

我對自己的SQL沒有足夠的信心來反駁他(並且這個查詢返回了幾千行),所以我想知道是否有人可以在下面給出查詢,讓我知道我要去哪裏?

這是MS SQL Server上運行2000

SELECT 
     A.T_ID, 
     A.check_number, 
     A.check_type_id, 
     A.cashier_id, 
     A.terminal_id, 
     A.first_tender, 
     A.tendered_date_time, 
     A.tender_amount, 
     A.change_amount, 
     A.net_tender_amount, 
     A.currency_received, 
     B.account_name, 
     B.account_number 
FROM tCTD AS A 
INNER JOIN tGAAAD AS B 
     ON A.check_number = B.check_number 
WHERE EXISTS 
    ( SELECT * 
     FROM tCTD 
     WHERE check_number = A.check_number 
     AND T_ID IN (1, 2, 3) 
    ); 
+0

EXISTS語句中的where子句不應該是WHERE check_number = B.check_number ?? –

回答

4

結果的客戶希望從表B中所有檢查#秒,再加上表A的任何 檢查#分別匹配任何的那檢查#分別在表B中,並且具有 的1,2一T_ID值,或3。

left join似乎適合的紙幣,與​​表B作爲左側:

FROM tGAAAD AS B 
LEFT JOIN tCTD AS A 
ON A.check_number = B.check_number 
    AND T_ID in (1,2,3) 
+0

哇,謝謝!這看起來完全像他想要的。快速提問:如果我有屬於表A的每列中具有NULL值的行(但DO具有表B中列的值),那麼這是否意味着該記錄來自表B,並且表A中沒有對應的條目? 再次感謝你,如果這是一個愚蠢的問題,很抱歉! – Oryx

+0

是的,如果找不到匹配的行,那麼'left join'ed表將在其所有列中具有'null' – Andomar

1

你有什麼就相當於從你的描述聽起來簡單的

SELECT 
     A.T_ID, 
     A.check_number, 
     A.check_type_id, 
     A.cashier_id, 
     A.terminal_id, 
     A.first_tender, 
     A.tendered_date_time, 
     A.tender_amount, 
     A.change_amount, 
     A.net_tender_amount, 
     A.currency_received, 
     B.account_name, 
     B.account_number 
    FROM 
      tCTD A 
     INNER JOIN 
      tGAAAD B 
       ON A.check_number = B.check_number 
    WHERE 
      A.T_ID IN (1, 2, 3); 

像你真正想要

SELECT 
     A.T_ID, 
     A.check_number, 
     A.check_type_id, 
     A.cashier_id, 
     A.terminal_id, 
     A.first_tender, 
     A.tendered_date_time, 
     A.tender_amount, 
     A.change_amount, 
     A.net_tender_amount, 
     A.currency_received, 
     B.account_name, 
     B.account_number 
    FROM 
      tGAAAD B 
     LEFT JOIN 
      tCTD A 
       ON A.check_number = B.check_number 
    WHERE 
      ISNULL(A.T_ID, 1) IN (1, 2, 3); 

但是,如果check_number提供了很多的表之間一對多的關係,因爲你也暗示這可能不會給你你想要的東西。你需要以某種方式彙總關係的產物嗎?