2012-03-27 2 views
1

У меня есть две таблицы записей, которые мне нужны, чтобы найти все совпадения. Таблицы основаны на разных идентификаторах первичного ключа, но точки данных точно такие же. Мне нужен быстрый запрос, который может показать мне записи, которые дублируются от первой таблицы до второй. Вот пример того, что я пытаюсь сделать:SQL GROUP BY HAVING issue

DECLARE @Table1 TABLE (ID INT, Value INT) 
DECLARE @Table2 TABLE (ID INT, Value INT) 

INSERT INTO @Table1 VALUES (1, 500) 
INSERT INTO @Table1 VALUES (2, 500) 

INSERT INTO @Table2 VALUES (3, 500) 
INSERT INTO @Table2 VALUES (4, 500) 

SELECT MAX(x.T1ID) 
     ,MAX(x.T2ID) 
FROM (
      SELECT T1ID = t1.ID 
        ,T2ID = 0 
        ,t1.Value 
      FROM @Table1 t1 
      UNION ALL 
      SELECT T1ID = 0 
        ,T2ID = t2.ID 
        ,t2.Value 
      FROM @Table2 t2 
     ) x 
GROUP BY x.Value 
HAVING COUNT(*) >= 2 

Проблема с этим кодом является то, что он возвращает запись 2 в таблице 1 коррелировало запись 4 в таблице 2. Мне действительно нужно это вернуть запись 1 в таблица 1 соотнесена с записью 3 в таблице 2. Я пробовал следующее:

SELECT MIN(x.T1ID) 
     ,MIN(x.T2ID) 
FROM (
      SELECT T1ID = t1.ID 
        ,T2ID = 0 
        ,t1.Value 
      FROM @Table1 t1 
      UNION ALL 
      SELECT T1ID = 0 
        ,T2ID = t2.ID 
        ,t2.Value 
      FROM @Table2 t2 
     ) x 
GROUP BY x.Value 
HAVING COUNT(*) >= 2 

Этот код не работает. Он возвращает 0,0.

Есть ли способ вернуть значение MIN, большее 0 для обеих таблиц?

+0

Не меняя много, я думаю, вы могли бы просто заменить '0' заполнители 'NULL' заполнителей (' T2ID = NULL', 'T1ID = NULL'). –

ответ

0

Возможно ответ на мой вопрос. Кажется, это работает. Есть ли причины, по которым я бы этого не сделал?

SELECT MIN(t1.ID) 
     ,MIN(t2.ID) 
FROM @Table1 t1 
     INNER JOIN @Table2 t2 ON t1.Value = t2.Value 
GROUP BY t1.Value 
0

Если вы хотите увидеть записи в table1, которые имеют матчи в table2 затем

select * 
from @Table1 T1 
where exists (select * from @Table2 T2 
where T1.ID=T2.ID 
-- you would put the complete join clause that defines a match here 
) 
+0

Я не хочу видеть все записи, которые соответствуют, мне нужны минимальные записи, которые соответствуют обеим таблицам. Я думаю, что мой ответ делает именно это. – Jon