2012-03-27 68 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