SQL GROUP BY HAVING проблема - PullRequest
       14

SQL GROUP BY HAVING проблема

1 голос
/ 27 марта 2012

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

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 для обеих таблиц?

Ответы [ 2 ]

0 голосов
/ 28 марта 2012

Если вы хотите видеть записи в таблице1, у которых есть совпадения в таблице2, тогда

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 голосов
/ 28 марта 2012

Могу ответить на мой собственный вопрос. Это похоже на работу. Есть ли причины, по которым я бы этого не делал?

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