2015-09-23 192 views
0

原来的表有三个不是唯一的列,其中值id单独的数据按组:选择基于列的值唯一行

id name    flag 
---------------------------- 
1 Andrey    0 
1 Andrey    1 
1 Olga    0 
1 Sasha    0 
2 Masha    1 
2 Masha    0 
2 Katya    1 
2 Vera    0 

在这里,我们有两组人,其中每个组有相等的两行名。我想编写一个select statemets,它重复带有标志0的名称行,当且仅当该确切名称在同一组中具有1个标志时。

因此,该数据预期的结果应该是:

id name    flag 
---------------------------- 
1 Andrey    1 
2 Masha    1 

因为安德烈和玛莎是重复的,他们有0标志了。

我试图选择这些值是使用查询像以下:

select * from names 
    where flag = 1 and id in 
    (select id from names where flag = 0) 

但它返回卡佳排过,什么是相应稳固。

+0

请标记您的数据库以及 –

+1

如果玛莎有一个ID = 2,和一个id = 5?还是回到玛莎? – jarlh

+0

@jarlh - 如果我们有两个具有id 2和id 5的Masha实例,我们不需要返回它,因为这些实例位于不同的组中(id是组的索引)。 – syscreat

回答

4

您可以使用EXISTS

SELECT n.* FROM Names n 
WHERE n.flag = 1 
AND EXISTS 
(
    SELECT 1 FROM Names n2 
    WHERE n.id = n2.id 
    AND n.name = n2.name 
    AND n2.flag = 0 
) 
+0

谢谢蒂姆!这正是我要找的。 – syscreat

2

您可以使用intersect运算符来获得具有两个标志的name

select name from names where flag = 0 
intersect 
select name from names where flag = 1 

在MySQL中,你可以做,

select n1.name 
from names n1 
join names n2 on n1.name = n2.name and n2.flag = 1 
where n1.flag = 0 
+0

感谢vkp!精彩的考试使用inersect语句。 – syscreat