我在SQL Server 2008中工作。我有以下情况。我有一个表有2列,包括主键。 (但是没有在键上定义唯一性约束。)我知道我有主键重复。每个主键,我想识别另一列中的不同值。所以,让我们说我有下表:
INSERT INTO some_table (Col1, Col2, COl3) VALUES
('A', '1', 'a'),
('A', '1', 'b'),
('B', '1', 'a'),
('B', '2', 'b'),
('C', '1', 'a'),
('C', '1', 'a'),
('C', '2', 'b')
我想按Col1和Col2进行分组,我想查找有多个不同Col3值的所有行。例如,使用上表,我希望看到: (A,1,a),(A,1,b)。
如何编写此SQL查询?我的SELECT语句需要包含Col1,Col2和Col3。但是,如果我执行GROUP BY Col1,Col2,那么我就无法在SELECT语句中使用Col3。
答案 0 :(得分:1)
你不可能在group by中为每个组选择多个项目,但也许你需要这样的东西:
select
col1,
col2,
stuff((select ',' + col3 from some_table t2
where t1.col1 = t2.col1 and t1.col2 = t2.col2
FOR XML PATH ('')), 1, 1, '') as items
from
some_table t1
group by
col1,
col2
having count(distinct col3) > 1
这将在第3列的逗号分隔列表中返回“重复”项目。
答案 1 :(得分:0)
这是实现目标的一种方式:
SELECT *
FROM
T T1
WHERE
EXISTS(SELECT * FROM T T2
WHERE
T1.a = T2.a
AND T1.b = T2.b
AND T1.c <> T2.c);
或类似的变体,允许给出所需的最小不同数字:
WHERE
(SELECT COUNT(DISTINCT T2.c)
FROM T T2
WHERE T1.a = T2.a AND T1.b = T2.b) >= 2;
答案 2 :(得分:0)
以下是解决此问题的一种方法:
;WITH CTE AS (
Select col1, col2, min(col3) as minvalue, max(col3) as maxvalue
From myTable
Group by col1, col2
Having min(col3) < max(col3)
)
Select *
From myTable t
Inner join cte
On t.col1 = cte.col1
And t.col2 = cte.col2
Where col3 >= minvalue
And col3 <= maxvalue
注意直接写在这里的代码,可能会有一些错误。
答案 3 :(得分:0)
试试这个:
CREATE TABLE #some_table
(
Col1 char(1),
Col2 char(1),
Col3 char(1)
)
INSERT INTO #some_table (Col1, Col2, COl3) VALUES
('A', '1', 'a'),
('A', '1', 'b'),
('B', '1', 'a'),
('B', '2', 'b'),
('C', '1', 'a'),
('C', '1', 'a'),
('C', '2', 'b')
select
stuff((select ',' + '('+Col1 +', '+ Col2 + ', ' + Col3 + ')' from #some_table T_IN
where T.col1 = T_IN.col1 and T.col2 = T_IN.col2 FOR XML PATH ('')), 1, 1, '') as items
from
#some_table T
group by col1, col2