gpt4 book ai didi

sql - 如何为连接的 'list' 表实现 EVERY 和 NO 操作

转载 作者:搜寻专家 更新时间:2023-10-30 23:28:17 24 4
gpt4 key购买 nike

我有两个表 Person 和 _Person_Name,其中包含 Name 列和 Owner 列,外键为 Person.Id。我正在寻找两个搜索操作,我称之为EVERYNO

1.) 每个

以下仅返回所有对应名称匹配查询 LIKE '%n%' 的人员 ID:

SELECT Person.Id as Result FROM Person
INNER JOIN _Person_Name AS __T1 ON Person.Id = __T1.Owner
WHERE __T1.Name LIKE '%n%'
GROUP BY Result
HAVING Count(Result)=(Select Count(*) FROM _Person_Name
WHERE Person.Id=_Person_Name.Owner)

但问题是我还必须处理其他查询,这些查询只需一个匹配就足够了,并且 HAVING 子句适用于 WHERE 子句中的所有术语。

有没有办法获得与上述查询中的 HAVING 子句相同的效果,但以某种方式在 WHERE 子句中表达这一点,以便可以向其中添加其他普通条件?

例子:

SELECT Person.Id as Result FROM Person 
INNER JOIN _Person_Name AS __T1 ON Person.Id = __T1.Owner
WHERE (EVERY __T1.Name LIKE '%n%')
OR (__T1.Name LIKE 'John')

第二个析取应该以普通方式运行,没有任何限制。现在,我正在寻找一种方式来表达 EVERY,就像上面的 HAVING 子句一样。查询应返回 __T1.Owner (=Person.Id) 只要具有匹配所有者的字段具有名称字段 __T1.Name LIKE 'John' 或在这种情况下,具有匹配所有者的所有 __T1.Name 字段都包含一个“n”。

如果不能在WHERE子句中表达,如何表达?

2.)

NO 搜索操作与 EVERY 类似,但基本条件被否定,即,我正在寻找其关联的 Name 部分都不匹配的 Persons查询。我想如果我有针对每个的解决方案,我可以很容易地做到这一点。

最佳答案

让我从 NO 的想法开始:如果您按条件 LIKE '%n%' 查找,则可以检查是否不存在任何行。您可以在带有 EXISTS 子查询的 WHERE 子句中执行此操作:

WHERE
NOT EXISTS (
SELECT 1 FROM _Person_Name AS __T2 WHERE Person.Id = __T2.Owner
and __T2.Name LIKE '%n%'
)
OR (__T1.Name LIKE 'John')

NOT EXISTS 检查是否没有匹配项。

基于此,EVERY 的实现是查看您对没有行的条件的否定是否为真,因此您正在寻找 NOT LIKE '%n%':

WHERE
NOT EXISTS (
SELECT 1 FROM _Person_Name AS __T2 WHERE Person.Id = __T2.Owner
and __T2.Name NOT LIKE '%n%'
)
OR (__T1.Name LIKE 'John')

这次 NOT EXISTS 将确保没有找到不符合您的标准的行 - 因此每一行都匹配它。

关于sql - 如何为连接的 'list' 表实现 EVERY 和 NO 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53342896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com