查找具有一个值但没有其他值的 sql 记录

Posted

技术标签:

【中文标题】查找具有一个值但没有其他值的 sql 记录【英文标题】:Finding sql records that do have one value, but not others 【发布时间】:2014-06-19 17:13:36 【问题描述】:

我有一个 sql 表,为了这篇文章的目的,我们会说它有 2 列,名称和值。有多个具有不同值条目的名称记录。在某些情况下,如果名称存在值,则还必须存在一组其他值。我试图确定这种情况不会发生的地方。例如,如果存在“combo”值,则必须存在“1”和“2”值才能处于正确状态。我正在尝试这样的查询:

Select  Name
From    Table
Where   Value = "combo"
And Value Not Exists 
(
    Select  Name
    From    Table
    Where   Value IN ("1", "2")
)

有更好的方法吗?

【问题讨论】:

【参考方案1】:
select name  
from table  
where value in ('combo', '1', '2')
group by name
having count(distinct value) = 3

select name  
from table 
group by name
having sum(case when value = 'combo' then 1 else 0 end) = 1
and sum(case when value = 1 then 1 else 0 end) = 1
and sum(case when value = 2 then 1 else 0 end) = 1

【讨论】:

【参考方案2】:

这将返回 combo 如果它存在于表中,但值 12 或两者都不存在。

select name
from table
where value = "combo"
and (
 select count(distinct value)
 from table
 where value IN ("1", "2")
) < 2

【讨论】:

【参考方案3】:

您的问题的一种解释是:

 `forall name: exists (value = combo) => exists (value in (1,2))`

A =&gt; B~A or B 相同,并转换为 SQL 如下:

select distinct name from T T1
where not exists (
    select 1 from T T2
    where T2.name = T1.name
      and T2.value = 'combo'
)
or exists (
    select 1 from T T3
    where T3.name = T1.name
      and T3.value in (1,2)
);

这是你的意思吗?

【讨论】:

以上是关于查找具有一个值但没有其他值的 sql 记录的主要内容,如果未能解决你的问题,请参考以下文章

需要 SQL 在不同的列中查找具有重复值的记录

SQL Join 2个表,返回只存在1个值而没有其他值的记录

MS Access SQL:聚合最小值但检索其他字段

需要为每条记录查找具有空值的所有列 - 访问 SQL 或 vba

查找一列中具有相同值而另一列中具有其他值的行?

如何在sql中排除具有某些值的记录