【问题标题】:Select unique rows based on column value根据列值选择唯一行
【发布时间】:2015-09-23 12:23:48
【问题描述】:

原始表有三个不唯一的列,其中 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

因为 Andrey 和 Masha 是重复的,而且他们也有 0 标志。

我尝试选择这些值是使用如下查询:

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

但它也返回 Katya 行,没有例外。

【问题讨论】:

  • 请同时标记您的数据库
  • 如果玛莎有一个 id = 2 和一个 id = 5 怎么办?还是返回玛莎?
  • @jarlh - 如果我们有两个 ID 为 2 和 5 的 Masha 实例,我们不需要返回它,因为这些实例位于不同的组中(id 是组的索引) .
  • @vkp - 这个问题主要是理论上的。无论如何,我指定了我现在正在使用的数据库引擎。

标签: sql sql-server select unique


【解决方案1】:

你可以使用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
)

【讨论】:

  • 谢谢你,蒂姆!这正是我正在寻找的。​​span>
【解决方案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

【讨论】:

  • 感谢 vkp!使用 inersect 语句的精彩示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多