【问题标题】:how to filter record which contains exactly two values in a table in sql?如何过滤sql表中恰好包含两个值的记录?
【发布时间】:2017-04-13 13:50:49
【问题描述】:

当我使用IN 时,它显示所有记录都包含 parameter1 或 parameter2,但我希望它带来的记录恰好包含它们两个,而不仅仅是其中一个。

如果我的问题不清楚,我可以尝试再次解释。

select Hatlar.Name
from HATLAR,
     [HAT-DURAK],
     DURAKLAR
where HATLAR.Hat_Id = [HAT-DURAK].Hat_Id
  and DURAKLAR.Durak_Id = [HAT-DURAK].Durak_Id
  and DURAKLAR.Name IN ('parameter1', 'parameter2')

【问题讨论】:

  • 今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接。
  • 您使用的是哪个 DBMS? (那是无效的标准 SQL)

标签: sql


【解决方案1】:

做一个GROUP BY。使用having count distinct 确保两个 DURAKLAR.Names 都存在。

select Hatlar.Name
from HATLAR,
     [HAT-DURAK],
     DURAKLAR
where HATLAR.Hat_Id = [HAT-DURAK].Hat_Id
  and DURAKLAR.Durak_Id = [HAT-DURAK].Durak_Id
  and DURAKLAR.Name IN ('parameter1', 'parameter2')
group by Hatlar.Name
having count(distinct DURAKLAR.Name) = 2

【讨论】:

    【解决方案2】:

    首先,学习使用正确的JOIN 语法。 FROM 子句中的逗号太像 20 世纪了。

    其次,你可以用GROUP BYHAVING为所欲为:

    Select h.Name
    from HATLAR h join
         [HAT-DURAK] hd
         on h.Hat_Id = hd.Hat_Id join
         DURAKLAR d
         on d.Durak_Id = d.Durak_Id
    where d.Name IN ('parameter1', 'parameter2')
    group by n.Name
    having count(d.Name) = 2;
    

    注意:如果连接表中可能出现重复项,请使用count(distinct d.Name)

    【讨论】:

    • 谢谢你的提前我当然知道,但我只是写了。
    【解决方案3】:

    如果我理解这个问题,这应该有效(假设参数实际上是那个,而不是硬编码字符串):

    select Hatlar.Name
    from HATLAR,
         [HAT-DURAK],
         DURAKLAR
    where HATLAR.Hat_Id = [HAT-DURAK].Hat_Id
      and DURAKLAR.Durak_Id = [HAT-DURAK].Durak_Id
      and DURAKLAR.Name Like '%' + @parameter1 + '%'
      and DURAKLAR.Name Like '%' + @parameter2 + '%'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-04
      • 2015-03-20
      • 1970-01-01
      • 2020-03-03
      • 2021-06-03
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多