Select 基于列值的唯一行
Select unique rows based on column value
原来的table有三个不唯一的列,其中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,当且仅当这个确切的名称在同一组中有 1 个标志时,它重复带有标志 0 的名称行。
因此,此数据的预期结果应为:
id name flag
----------------------------
1 Andrey 1
2 Masha 1
因为安德烈和玛莎是重复的,他们也有 0 个标志。
我尝试 select 这些值是使用如下查询:
select * from names
where flag = 1 and id in
(select id from names where flag = 0)
但也是 returns Katya 行,没有例外。
您可以使用 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
您可以使用 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
)
原来的table有三个不唯一的列,其中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,当且仅当这个确切的名称在同一组中有 1 个标志时,它重复带有标志 0 的名称行。
因此,此数据的预期结果应为:
id name flag
----------------------------
1 Andrey 1
2 Masha 1
因为安德烈和玛莎是重复的,他们也有 0 个标志。
我尝试 select 这些值是使用如下查询:
select * from names
where flag = 1 and id in
(select id from names where flag = 0)
但也是 returns Katya 行,没有例外。
您可以使用 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
您可以使用 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
)