如何为联接的“列表”表实施“所有”和“否”操作

时间:2018-11-16 17:43:28

标签: sql database sqlite

我有两个表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

1 个答案:

答案 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')

这一次“不存在”将确保没有发现不符合您条件的行-因此,每一行都与之匹配。