Sql server 如何为此场景编写SQL查询?

Sql server 如何为此场景编写SQL查询?,sql-server,matching,records,Sql Server,Matching,Records,我正在尝试编写一个查询,其中我希望表1中的所有项都在表2中,它们满足下面的第一个内部联接条件(这是工作查找) 然后我想检查一下表3,看看是否有例外。例外情况基于参考号(参考号)。如果参考号存在于表3中,那么我需要检查门店号(门店号)是否匹配。如果它们匹配,那么我需要表1中的匹配记录。如果没有,则从表1中排除匹配记录 但是,如果表3中不存在引用号,那么我希望表1中的记录与表2匹配 谢谢 USE master GO table1 table2 table3 SELECT T1.TERMIN

我正在尝试编写一个查询,其中我希望表1中的所有项都在表2中,它们满足下面的第一个内部联接条件(这是工作查找)

然后我想检查一下表3,看看是否有例外。例外情况基于参考号(参考号)。如果参考号存在于表3中,那么我需要检查门店号(门店号)是否匹配。如果它们匹配,那么我需要表1中的匹配记录。如果没有,则从表1中排除匹配记录

但是,如果表3中不存在引用号,那么我希望表1中的记录与表2匹配

谢谢

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)
选择
T1.终端,
T1.操作员,
T1.TRANS_编号,
T1.序号,
T1.门店号,
T2.参考号,
T2.SDATE,
T2.EDATE,
T1.POS_日期,
T1.1项目,
T1.ITYPE,
T1.售出数量,
T1.价格,
T2.OI_金额
从[表1]中取T1
内部连接[表2]为T2
在T1.ITEM=T2.ITEM上
和T1.POS_DATE>T2.SDATE

和T1.POS_DATE左连接到表3如何?然后是where子句。它可能会选择您不需要的日期范围。虽然这种情况很少发生,但这通常是更好的做法
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)