2016-11-24 4 views
1

欠落している行を見つける必要がありますが、返されるBOTHテーブルのデータが必要です。私はgoogleをチェックしましたが、似たような質問は見つかりませんでした。SQL Server:Table1の行をTable2にはないが、テーブルのデータが必要です。

私はselect文の結果が表2で不足している時間はないの日付とtrnsaction番号を持っている必要がありますので、表1の時間を持っていない表2から日付とTRANSACTION_NUMを選択する必要が
TableA 

thetime real-time 
1  1 pm 
2  5 pm 
3  7 pm 
4  9 pm 
5  11 pm 

Table2 
thedate transaction_num thetime 
1/1/2000 111    1 
1/1/2000 111    4 
1/1/2000 111    5 
2/1/2000 111    2 
2/1/2000 111    4 
2/1/2000 222    1 
2/1/2000 222    5 

thedate transaction_num thetime 
1/1/2000 111    2 
1/1/2000 111    3 
2/1/2000 111    1 
2/1/2000 111    3 
2/1/2000 111    5 
2/1/2000 222    2 
2/1/2000 222    3 
2/1/2000 222    4 

これは私が持っているコードですが、それは私にマルチパート結合エラーを与えている:

select t2.thedate, t2.transaction_num, t1.thetime 
from table2 t2 
where not exists(select t1.thetime 
       from table1 t1 
       where t2.thetime = t1.thetime) 

誰もがこの問題を解決するか、その答えに私を指すことができる方法を知っていますか? 欠落している行のスタックオーバーフローに関するほとんどの質問は、1つのテーブルからデータを返すことを伴いますが、2つのテーブルに必要です。

あなたは

+2

あなたが明示的にthetime'をt1に見つからない 'T2の行をチェックしている場合 、あなたは' t1.thetime'があなたのselect句にあるように何を期待していますか? –

+0

わかりません。 'thetime' 2,3、そして1(あなたの期待された結果から)は'テーブルA 'から提供したサンプルに現れます。説明できますか? –

+0

't2.thetime = t1.thetime'に参加しているのであれば、なぜあなたはselect文で' t2.thetime'を使うのですか? – sgmoore

答えて

2

すべての日付のすべてのtransaction_numsは、それらに関連するすべての時間を持っている必要がありそうですありがとうございました。それ以外の場合は、行方不明として扱われます。

これを行うには、最初にtable2からのdistinct_dateとtransaction_numとtable1からの時間をクロスジョインすることができます。次に、この派生テーブルに結合を残して、欠落している行を取得します。

select tt.thedate, tt.transaction_num,tt.thetime 
    from (
      select * from (
     (select distinct thedate,transaction_num from table2) a cross join 
     (select distinct thetime from table1) b 
     ) 
     ) tt 
     left join table2 t2 on t2.transaction_num=tt.transaction_num and t2.thetime=tt.thetime and tt.thedate=t2.thedate 
where t2.transaction_num is null and t2.thedate is null and t2.thetime is null 

Sample Demo

+0

サンプルデモのコードは、私が探していたものです!どうもありがとうございます。私はコードがこのように複雑になるとは思わなかった。私は驚いています。 – Sven

関連する問題