2016-07-04 3 views
1

Я хочу объединить две таблицы на основе нескольких строк и не могу найти правильный способ сделать это.Таблица соответствия SQL 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 

Я хочу, чтобы получить Id из table1, которые соответствуют точно строки в table2 , Я ожидаю, что возвращение должно быть 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) 

Любые предложения? Благодарю.

EDIT: 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 также не должен быть сгруппирован по Id?
Также псевдоним 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 

Update: Это на самом деле оказался более интересным, чем: здесь мы ищем точное совпадение по всем строкам:

Select t1.Id 
From table1 t1 
Left Join table2 t2 --< Left Join to register NULLs from table2 
    On t1.LocationId = t2.LocationId 
AND t1.LocationNo = t2.LocationNo 
Group By t1.Id 
Having --< Number of records from each table equals the count of matching criteria rows 
    Count(t1.LocationId) = (Select Count(*) From table2) 
AND Count(t2.LocationId) = (Select Count(*) From table2) 

Исходные данные для тестирования:

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 –