2017-06-16 93 views
0

我想寫一個查詢,我希望Table1中滿足下面的第一個內部聯接條件(這是工作查找)的所有項目。如何爲這個scenerio編寫一個SQL查詢?

然後我想檢查table3是否有例外。例外情況以參考編號(REF_NO)爲基礎。如果參考編號存在於table3中,那麼我需要檢查商店編號(STORE_NO)是否匹配。如果它們匹配,那麼我想要table1中的匹配記錄。如果不是,則從表1中排除匹配的記錄。

但是,如果table3中不存在引用編號,那麼我希望table1中與table2匹配的記錄。

感謝

USE master 
GO 

table1 
table2 
table3 

SELECT 
    T1.TERMINAL, 
    T1.OPERATOR, 
    T1.TRANS_NO, 
    T1.SEQ_NO, 
    T1.STORE_NO, 
    T2.REF_NO, 
    T2.SDATE, 
    T2.EDATE, 
    T1.POS_DATE, 
    T1.ITEM, 
    T1.ITYPE, 
    T1.SOLD_QTY, 
    T1.PRICE, 
    T2.OI_AMT 
FROM [table1] As T1 

INNER JOIN [table2] As T2 
ON (T1.ITEM = T2.ITEM) And (T1.POS_DATE BETWEEN T2.SDATE And T2.EDATE) 

INNER JOIN [table3] As T3 
ON (T2.REF_NO = T3.REF_NO) And (T1.STORE_NO = T3.STORE) 
+0

如何加入表3的左加入?然後是where子句。 –

回答

0
SELECT 
    T1.TERMINAL, 
    T1.OPERATOR, 
    T1.TRANS_NO, 
    T1.SEQ_NO, 
    T1.STORE_NO, 
    T2.REF_NO, 
    T2.SDATE, 
    T2.EDATE, 
    T1.POS_DATE, 
    T1.ITEM, 
    T1.ITYPE, 
    T1.SOLD_QTY, 
    T1.PRICE, 
    T2.OI_AMT 
FROM [table1] As T1 
INNER JOIN [table2] As T2 
    ON T1.ITEM = T2.ITEM 
    AND T1.POS_DATE > T2.SDATE 
    AND T1.POS_DATE <= T2.EDATE 
WHERE EXISTS ( SELECT TOP (1) 1 
       FROM table3 as T31 
       WHERE T2.REF_NO = T31.REF_NO 
       AND T1.STORE_NO = T31.STORE) 
OR NOT EXISTS (SELECT TOP (1) 1 
       FROM table3 as T32 
       WHERE T2.REF_NO = T32.REF_NO) 

這應該工作,它會檢查您的兩個條件。我也鼓勵你不要使用BETWEEN條款,並使用兩個條件指定日期範圍。

+0

它的工作原因 - 爲什麼不鼓勵使用BETWEEN? – user3537446

+0

它可能選擇您不需要的日期範圍。雖然它很少會發生,但這通常是更好的做法 –