2017-06-16 38 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

它可能选择您不需要的日期范围。虽然它很少会发生,但这通常是更好的做法 –