假设我有这个问题:
SELECT col1, col2, col3
FROM tab1
GROUP BY col1, col2, col3
HAVING COUNT(*) > 1 -- **************EDIT****************
我希望这组列是唯一的。但是,现在我想添加col4,它可以复制,所以如果我添加它并将其分组,它就不起作用。
在SQL Server 2008 R2中有更好的方法吗?
SELECT a.col1, a.col2, a.col3, b.col4
FROM (
SELECT col1, col2, col3
FROM tab1
GROUP BY col1, col2, col3
HAVING COUNT(*) > 1 -- **************EDIT****************
) a JOIN tab1 b
ON a.col1 = b.col1
AND a.col2 = b.col2
AND a.col3 = b.col3
编辑:对不起,伙计们,这就是我想要的。你最初发布的查询是正确的,一个简单的SELECT就可以了。我需要的是,当存在重复项时,为col4
的每个不同组显示col1, col2, col3
的所有值。
感谢。
答案 0 :(得分:1)
这在技术上与您要求的不同,但它可能满足您的要求。
如果选择所有四列,按所有四列分组,并选择COUNT(*),则计数仅表示第四列的其他三个子集出现的次数。
SELECT col1, col2, col3, col4, COUNT(*) AS c
FROM tab1
GROUP BY col1, col2, col3, col4
例如,如果您的结果是['JIM','JOE','BOB','BILLY',5],则表示您在预告片公园中每个Jim Joe Bob都有5比5。
编辑:
根据我上次的评论,试试这个。
SELECT col1, col2, col3, col4
FROM tab1
答案 1 :(得分:1)
你这样做的方式对我来说似乎没问题。但您也可以在派生表中尝试SELECT DISTINCT col1, col2, col3 FROM tab1
而不是SELECT col1, col2, col3 FROM tab1 GROUP BY col1, col2, col3
。我不确定它是否会对执行计划产生任何影响。
此外,我可能会误解您要实现的目标,但看起来您的查询结果将与SELECT a.col1, a.col2, a.col3, a.col4 FROM table1 a
答案 2 :(得分:0)
您可以使用CTE,但您的方法没有任何问题:
WITH G AS (
SELECT col1, col2, col3
FROM tab1
GROUP BY col1, col2, col3
)
SELECT G.col1, G.col2, G.col3, b.col4
FROM G JOIN tab1 b
ON G.col1 = b.col1
AND G.col2 = b.col2
AND G.col3 = b.col3;