如何查找表中具有一个相等值和一个不同值的行

时间:2014-06-25 03:42:08

标签: sql sql-server

我有下表:

ID       Number      Revision
x         y           0
x         y           1
z         w           0
a         w           0
a         w           1
b         m           0
b         m           0

我需要返回相同Number的行,然后是一个具有相同Revision.Number的ID可以是“Null”并且我不需要这些值。 输出应为:

z         w           0
a         w           0

我尝试了以下查询:

SELECT a.id,a.number,a.revision,
FROM table a INNER JOIN 
             (SELECT id, number, revision FROM table where number > '0' 
              GROUP BY number HAVING COUNT(*) > 1
             ) b ON  a.revision = b.revision AND a.id != b.id

一点点补充 - 我的表格中有相同的编号,ID和修订版 - 我不需要在查询中显示这些行!

不行!请帮我弄清楚如何解决它。 感谢。

3 个答案:

答案 0 :(得分:0)

Select t.Id,s.number,t.revision
from (Select number,count(*) 'c'
     from table t1 
     where revision=0 
     group by number 
     having count(*) > 1 
   ) s join table t on t.number= s.number
where revision = 0 

答案 1 :(得分:0)

您的查询并不是那么遥远:

SELECT a.id,a.number,a.revision
FROM table a 
JOIN (
    -- multiple id for the same number and revision 
    SELECT number, revision 
    FROM table 
    GROUP BY number, revision 
    HAVING COUNT(*) > 1
) b 
    ON  a.revision = b.revision 
   AND a.number = b.number

未经测试,但你应该明白这一点。如果您的sql-server是重发版本,您也可以使用OLAP函数解决此问题。

要过滤掉整行复制的行,我们只能通过分组选择唯一的行并具有:

SELECT a.id,a.number,a.revision
FROM table a 
JOIN (
    -- multiple id for the same number and revision 
    SELECT number, revision 
    FROM table 
    GROUP BY number, revision 
    HAVING COUNT(*) > 1
) b 
    ON  a.revision = b.revision 
   AND a.number = b.number
GROUP BY a.id,a.number,a.revision
HAVING COUNT(1) = 1

答案 2 :(得分:0)

另一种简单方法:

SELECT DISTINCT  b.id, b.Number, b.Revision
FROM       tbl a
INNER JOIN tbl b
ON         a.ID != b.ID  AND  a.Number = b.Number  AND  a.Revision = b.Revision;

这是在MySql 5中测试的,语法可能略有不同。