2016-07-04 2 views
1

여러 행을 기반으로 두 개의 테이블을 결합하려고하는데 올바른 방법을 찾을 수 없습니다. 표 2 정확히 행과 일치여러 행에 MS SQL 일치 테이블이 있습니다.

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 

표 2

Location LocationNo 
      1    1 
      2    2 
      3    3 
내가 표에서 이드 싶어 :

표는 다음과 같은 형태 . 반환이 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)이 될 것을 기대하고이 경우를 들어 표 2

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는 Id에 의해 groupped 안된다?
또한 별칭 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 

업데이트 : 그것은 사실보다 더 흥미으로 밝혀졌다 : 여기에 우리는 모든 행에 대한 정확한 일치를 찾고 있습니다 :

테스트를위한

소스 데이터 : Inner Join

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

만들기 사용.

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 –

관련 문제