2017-06-16 3 views
0

私はテーブル1のすべての項目をtable2に入れたいと思っています。これは、以下の最初の内部ジョイン基準を満たしています(これはwork findです)。このscenerioのSQLクエリを書く方法は?

次に、例外があるかどうかをtable3にチェックします。例外は参照番号のベースです(REF_NO)。参照番号がtable3に存在する場合は、ストア番号(STORE_NO)が一致するかどうかを確認する必要があります。一致した場合は、table1の一致するレコードが必要です。そうでなければ、一致するレコードをtable1から除外します。

ただし、参照番号がtable3に存在しない場合は、table2と一致するtable1のレコードが必要です。

おかげ

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へのLEFT JOINはどうですか?次に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句を使用せず、2つの条件を使用して日付範囲を指定することをお勧めします。

+0

それはうまくいく - なぜ彼らの間の使用を阻止するのですか? – user3537446

+0

必要のない日付範囲を選択することがあります。まれに起こることはありますが、これは一般的にはより良い方法です –

関連する問題