2015-09-23 242 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