- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两个表 Person 和 _Person_Name,其中包含 Name 列和 Owner 列,外键为 Person.Id。我正在寻找两个搜索操作,我称之为EVERY 和NO。
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/
我是一名优秀的程序员,十分优秀!