我有两个表Person和_Person_Name,其中包含一个列Name和一个列Person,其中Person.Id作为外键。我正在寻找两个搜索操作,分别称为每个和否。
1。)每个
以下内容仅返回与查询LIKE '%n%'
对应的 all 名称对应的人员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')
第二个析取符应该以普通方式运行而没有任何限制。现在,我正在寻找一种表达每个的方法,就像上面的 HAVING 子句中那样。每当具有匹配所有者的一个字段具有名称字段__T1.Owner
或 all {时,查询应返回__T1.Name LIKE 'John'
(= Person.Id)。拥有者匹配的{1}}字段包含“ n”。
如果无法在WHERE子句中表达它,怎么表达呢?
2。)否
NO 搜索操作类似于 EVERY ,但是基本条件被否定,即,我正在寻找与之关联的名称部分均不匹配的人员查询。我想,如果我有 EVERY 的解决方案,我就能轻松实现。
编辑:DávidLaczkó的回答是正确的。如果他还没有编辑答复,则需要进行一些小的更改。这是根据他的回答得出的NO解决方案:
__T1.Name
答案 0 :(得分:1)
让我从一个否定的想法开始:如果您按条件'%n%'查找,则可以检查是否不存在任何行。您可以在WHERE子句中使用EXISTS子查询来做到这一点:
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检查是否不存在匹配项。
基于此,对每个人来说,实现都是要查看对无行条件的求反是否成立,因此您正在寻找不喜欢'%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')
这一次“不存在”将确保没有发现不符合您条件的行-因此,每一行都与之匹配。