2016-07-04 7 views
1

複数の行に基づいて2つのテーブルを結合したいが、これを行う正しい方法が見つからない。表2で正確に行を一致複数行のMS SQLマッチテーブル

TABLE1

Id Location LocationNo 
1   1    1 
1   2    2 
1   3    3 
2   1    1 
2   2    2 
3   2    1 
3   1    2 
3   3    3 
4   1    1 
4   2    2 
4   3    3 
4   4    4 

table2の

Location LocationNo 
      1    1 
      2    2 
      3    3 
私はTABLE1からIDを取得したい:

表には、次のようになります。 返信はId 1になるはずです。

私は以下のクエリを試しましたが、結果が期待通りではありません。

SELECT t.Id 
FROM table1 t1 
WHERE EXISTS (SELECT 1 
       FROM table2 t2 
       WHERE t1.LocationId = t2.LocationId 
         AND t1.LocationNo = t2.LocationNo) 

お勧めはありますか?ありがとう。

編集:私は、結果がNULLであることを期待して、このケースでは table2の

Location LocationNo 
      1    1 
      2    2 
      3    3 
      5    4 

答えて

1

私はあなたのクエリでこの

IF EXISTS(SELECT 1 
      FROM (SELECT Count(1) cnt, 
         id 
        FROM Table1 a 
        GROUP BY id) a 
       JOIN (SELECT t1.Id, 
           Count(1) cnt 
         FROM table1 t1 
           JOIN table2 t2 
           ON t1.[Location] = t2.[Location] 
            AND t1.LocationNo = t2.LocationNo 
         GROUP BY t1.Id 
         HAVING Count(1) = (SELECT Count(1) 
              FROM table2)) b 
        ON a.cnt = b.cnt 
         AND a.Id = b.id) 
    WITH tot_count 
     AS (SELECT Count(1) cnt, 
        id 
      FROM #Table1 a 
      GROUP BY id), 
     sub_cnt 
     AS (SELECT t1.Id, 
        Count(1) cnt 
      FROM table1 t1 
        JOIN table2 t2 
        ON t1.[Location] = t2.[Location] 
         AND t1.LocationNo = t2.LocationNo 
      GROUP BY t1.Id 
      HAVING Count(1) = (SELECT Count(1) 
           FROM table2)) 
    SELECT b.id 
    FROM tot_count a 
     JOIN sub_cnt b 
      ON a.cnt = b.cnt 
       AND a.Id = b.id 
ELSE 
    SELECT NULL 
+0

最初のcteはイドによってもぐってはいけませんか?
また、別名aはt1でなければなりません。

+0

@CodrutMerlusca - そう逃した、 –

+0

@ Y.Bを更新しました。あなたはこれを読んだか?戻り値はId 1でなければならないと期待しています。*あなたのクエリはID「1」のみ返されるかどうか –

2
Select Distinct t1.Id --< Use Distinct to return unique values only 
From table1 t1 
Inner Join table2 t2 --< Use Inner Join instead of "where exists" 
    On t1.LocationId = t2.LocationId 
AND t1.LocationNo = t2.LocationNo 

更新:それは実際にはそれよりももっと面白いことが判明:ここではすべての行で完全一致を探しています:

テストのための

ソースデータ:

With table1 As (
    Select * From (Values 
    (1, 1, 1), 
    (1, 2, 2), 
    (1, 3, 3), 
    (2, 1, 1), 
    (2, 2, 2), 
    (3, 2, 1), 
    (3, 1, 2), 
    (3, 3, 3), 
    (4, 1, 1), 
    (4, 2, 2), 
    (4, 3, 3), 
    (4, 4, 4) 
    ) V (Id, LocationId, LocationNo) 
), table2 As (
    Select * From (Values 
     (1, 1), 
     (2, 2), 
     (3, 3) 
    ) V (LocationId, LocationNo) 
) 
+1

何を探していると思うが 'T'(t.Id' 'で) – Jamiec

+0

@Jamiecのおかげで別名を持っています。 OPのスクリプトの問題を逃した。 –

+1

@ Y.B。ありがとう....あなたの解決策も動作します:) –

2

Inner Joinを利用します。

select t1.Id -- or t2.id, depends which table you want the ID from 
from table1 t1 
inner join table2 t2 
on t1.LocationId = t2.LocationId 
and t1.LocationNo = t2.LocationNo 
+0

これを参照してくださいhttp://meta.stackoverflow.com/questions/327636/educating-people-to-flag-spam-and-not-vote-to-close –

関連する問題