用于获取给定组不相同的行的SQL查询

时间:2013-03-14 10:52:31

标签: sql select

例如,如下表所示

c1      c2      c3
a       b       1
a       b       2
c       d       1
c       d       1
e       f       3
e       f       3
e       f       3
x       y       5

在这种情况下,我希望组值为c1,c2,其中 all 至少有一个c3不相同。所以在这种情况下(a,b),因为(a,b)的一行是1而另一行的(a,b)是2。

也不得报告row(x,y)。

3 个答案:

答案 0 :(得分:4)

SELECT  c1, c2
FROM    tableName
GROUP   BY c1, c2
HAVING  COUNT(DISTINCT c3) > 1

输出

╔════╦════╗
║ C1 ║ C2 ║
╠════╬════╣
║ a  ║ b  ║
╚════╩════╝

但是你想要获得所有列的所有行

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT  c1, c2
            FROM    tableName
            GROUP   BY c1, c2
            HAVING  COUNT(DISTINCT c3) > 1
        ) b ON  a.c1 = b.c1 AND 
                a.c2 = b.c2

输出

╔════╦════╦════╗
║ C1 ║ C2 ║ C3 ║
╠════╬════╬════╣
║ a  ║ b  ║  1 ║
║ a  ║ b  ║  2 ║
╚════╩════╩════╝

答案 1 :(得分:1)

使用EXISTS

SELECT c1, c2, c3
FROM dbo.TableName t1
WHERE EXISTS
(
    SELECT 1 FROM dbo.TableName t2
    WHERE t1.c1 = t2.c1 AND t1.c2 = t2.c2
    AND   t1.c3 <> t2.c3
)

Demo(如果您只想要一条记录,请使用t1.c3 < t2.c3

答案 2 :(得分:1)

编辑:没有包含单对的广告:

如果你想得到每一对C1,C2,其中每个C3的值都不同,以下将会这样做:

SELECT
    C1,
    C2
FROM
    dbo.Table1
GROUP BY
    C1,
    C2
HAVING
    COUNT(1) = COUNT(DISTINCT C3)
AND COUNT(1) > 1