2016-11-14 112 views
0

我已经搜索了很多关于它的信息,但是找不到有关我的问题的任何相关信息。我有这样的数据集。从SQL中的同一个表ID中选择不同的值列表

Column1 Column2 
    A   B  
    A   B 
    A   C 
    X   B 
    X   B 
    Y   C 
    Y   B 
    T   A 
    T   A 
    T   A 

我可以不同的Column1与出现的总数。但我实际上想要删除常量行。当我运行查询时,结果应该是这样的;

Column1 Column2 
    A   B  
    A   B 
    A   C 
    Y   C 
    Y   B 

正如我们上面所看到的,A和Y在Column2中有不同的值。我如何查询?我使用Sql Server 2014

+0

所以你要删除第1列中的值只有第2列中有一个值的行?如果他们有多个第2列的可能性,你想离开他们? – Fritz

+0

是的。这正是我想要查询的内容。 –

回答

1

你要算配对的出现次数,你做任何事情

SELECT ColumnA, ColumnB, count(*) 
FROM [source] 
GROUP BY ColumnA, ColumnB 

这会给你的每个配对的列表,以及它发生之前。接下来,你要算在ColumnA每个值多少配对了,并剪下的人只有一个选择:

SELECT ColumnA, count(*) 
FROM 
    (
    SELECT ColumnA, ColumnB, count(*) 
    FROM [source] 
    GROUP BY ColumnA, ColumnB 
    ) 
GROUP BY ColumnA 
HAVING count(*) > 1 

这将会给你,你要找的ColumnA值的列表。从那里,你想寻找ColumnA的这些值在原始数据与WHERE .. IN声明:

SELECT ColumnA, ColumnB 
FROM [source] 
WHERE ColumnA IN 
    (
    SELECT ColumnA, count(*) 
    FROM 
     (
     SELECT ColumnA, ColumnB, count(*) 
     FROM [source] 
     GROUP BY ColumnA, ColumnB 
     ) 
    GROUP BY ColumnA 
    HAVING count(*) > 1 
    ) 
+0

谢谢Fritz。有了一些配置sql服务器,我可以做到这一点。 –

1

COUNT(DISTINCT ...)可能有CTE工作:

; WITH CTE AS (
    SELECT Column1 
    FROM [my_table] 
    GROUP BY Column1 
    HAVING COUNT(DISTINCT Column2) > 1 
) 
SELECT t.* 
FROM [my_table] t 
JOIN CTE ON CTE.Column1 = t.Column1; 
+0

谢谢约翰。你的解决方案也有效。 –

相关问题