2012-03-27 190 views
1

我有兩個需要查找所有匹配的記錄表。這些表基於不同的主鍵標識符,但數據點完全相同。我需要一個快速查詢,可以顯示從第一個表格到第二個表格重複的記錄。這裏是什麼,我試圖做一個例子:SQL GROUP BY HAVING問題

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 

這段代碼的問題是,它在相關的表1返回記錄2表2。我真的需要它返回的記錄1,記錄4表1與表2中的記錄3相關聯。我嘗試了以下方法:

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。

有兩種方法可以爲兩個表返回大於0的MIN值嗎?

+0

記錄沒有太大變化,我想你可以簡單地替換'0'佔位符用'NULL'佔位符(' T2ID = NULL','T1ID = NULL')。 – 2012-03-27 22:08:50

回答

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中有匹配的表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

我不想看到所有匹配的記錄,我需要從兩個表匹配的最小記錄。我想我的答案就是這樣。 – Jon 2012-03-27 21:09:22