【问题标题】:Difference between "exists", and "in" in SQL [closed]SQL中“存在”和“在”之间的区别[关闭]
【发布时间】:2020-12-25 08:37:46
【问题描述】:

这是我的查询

select nom, prenom, mail ,trig 
from dbo.reseau
where  nom, prenom, mail, trig in  
(
    select mail, nom, prenom, mail, trig
    from dbo.reseau
    group by mail, nom, prenom, mail, trig
    having count(1) > 1
)

这个查询不起作用,他们告诉我必须使用存在。我用了id,不行。

【问题讨论】:

  • 您的问题是什么? “此查询不起作用” 不是问题。你是在问the difference between them 是什么让你的 Q 成为一个骗子,或者如何解决其他问题?
  • 您需要详细说明您要达到的目标,并显示一些示例数据和预期结果。首先,IN 仅适用于单个列,而不适用于列列表。
  • 我想为每个列显示重复项
  • 抱歉,以我的投票结束。我建议您坐下来花一天时间制定一个具体的查询。同时,除了“他们一直在告诉我”,您还可以坐下来阅读文档——文档中的语法和示例清楚地解释了“在”和“存在”ae 的含义。我不确定您从哪里得到当 TSQL 明确指出时可以使用“in”的想法:(docs.microsoft.com/en-us/sql/t-sql/language-elements/…) - “是一个具有一列结果集的子查询”。你的有 5 个。
  • 要添加到 TomToms 的评论,你有质量问题的历史,我建议再次阅读常见问题解答,了解如何提出一个好的问题,例如Tips for asking a good SQL question。我们都想为您提供帮助,但我们对您的系统/设计/要求都很陌生,因此您必须努力以清晰、简洁的方式向我们传达您的问题。 minimal reproducible example 是必须的。

标签: sql sql-server tsql count window-functions


【解决方案1】:

您的语法无效。您似乎正在寻找元组相等性:

where (nom, prenom, mail, trig) in (
    select mail, nom, mail, trig
    from ...
)

很少有数据库支持这种语法,SQL Server 不是其中之一。

您似乎想展示重复项。您可以使用exists,但您需要一个主键列(或一组列),并且通过查看查询并不清楚它是哪一个。假设id

select r.*
from dbo.reseau r
where exists (
    select 1 
    from dbo.reseau r1
    where 
        r1.id <> r.id 
        and r1.nom = r.nom 
        and r1.prenom = r.prenom 
        and r1.mail = r.mail 
        and r1.trig = r.trig
)

我认为用窗口计数表示会更简单:

select *
from (
    select r.*, count(*) over(partition by nom, prenom, mail, trig) cnt
    from dbo.reseau r
) r
where cnt > 1

【讨论】:

  • 此查询用于显示此列的重复项
【解决方案2】:

EXISTS:指定一个子查询来测试行是否存在。

换句话说...这个子查询是否返回任何行?

IN:确定指定值是否与子查询或列表中的任何值匹配。

换句话说...嘿,请告诉我职称是“设计工程师”、“工具设计师”、“营销助理”的员工的姓名 来自下面链接的代码 sn-p。

SELECT p.FirstName, p.LastName, e.JobTitle  
FROM Person.Person AS p  
JOIN HumanResources.Employee AS e  
    ON p.BusinessEntityID = e.BusinessEntityID  
WHERE e.JobTitle IN ('Design Engineer', 'Tool Designer', 'Marketing Assistant');  
GO  

进一步阅读

MS DOCS EXISTS

MS DOCS IN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2017-01-31
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多