SQL GROUP BY HAVING问题
问题描述:
我有两个需要查找所有匹配的记录表。这些表基于不同的主键标识符,但数据点完全相同。我需要一个快速查询,可以显示从第一个表格到第二个表格重复的记录。这里是什么,我试图做一个例子: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值吗?
答
可能回答我自己的问题。这似乎工作。我有什么理由不这样做?
SELECT MIN(t1.ID)
,MIN(t2.ID)
FROM @Table1 t1
INNER JOIN @Table2 t2 ON t1.Value = t2.Value
GROUP BY t1.Value
答
如果你想看到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
记录没有太大变化,我想你可以简单地替换'0'占位符用'NULL'占位符(' T2ID = NULL','T1ID = NULL')。 – 2012-03-27 22:08:50