如果我有两个要连接的表,并且我编写了最简单的查询,如下所示:

SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id

有一些记录因为有多个雇主而每个id有多个行,因此t1如下所示:
ID         Name         Employer
12345      Jerry        Comedy Cellar
12345      Jerry        NBC
12348      Elaine       Pendant Publishing
12346      George       Real Estate
12346      George       Yankees
12346      George       NBC
12347      Kramer       Kramerica Industries

t2与类似的i d相链接,但是与一些我想看到的活动相链接——因此上面的SELECT *被链接。尽管我不希望在Employer列是“nbc”时返回多行,但其他都很好。
这里唯一重要的是t2t1小,因为t1是每个人,而且t2只来自做特定活动的人,所以有些匹配不会返回t2中的任何内容,但我仍然希望返回它们,因此返回LEFT JOIN
如果我这样写查询:
SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE Employer <> "NBC"

然后它完全删除了杰瑞和乔治——而我真正想要的是NBC的行不被返回,而是返回与它们相关联的任何其他行。
如何在将t1t2连接以返回除nbc行之外的每一行时编写查询?理想的输出是来自t1的所有行,无论它们是否与所有t2匹配,除了在返回文件中删除所有以“nbc”作为雇主的行。基本上,这里的理想做法是在合适的地方返回连接,但不管怎样,对于任何以“nbc”为雇主的人来说,删除整个行而不删除其他行。
我写得越多,似乎就应该在JOIN之前运行一个查询,删除t1中以“nbc”为其雇主的所有行,然后运行普通查询。

最佳答案

基本子集过滤
通过扩展ON子句,可以筛选两个合并(连接)子集中的任何一个。

SELECT    *
FROM      t1
LEFT JOIN t2
       ON t1.ID = t2.ID
      AND t2.Employer != 'NBC'

如果您现在得到null值,而您不需要它们,您可以添加:
WHERE t2.Employer IS NOT NULL

扩展逻辑:
SELECT    *
FROM      t1
LEFT JOIN t2
       ON (t1.ID = t2.ID AND t2.Employer != 'NBC')
       OR (t2.ID = t2.ID AND t2.Employer IS NULL)

使用UNION
基本上,JOIN用于水平链接,UNION用于数据集的垂直链接。
它合并到结果集:第一个没有nbc,第二个(基本上是一个OUTER JOIN)添加T1中不属于T2的每个人。
SELECT    *
FROM      t1
LEFT JOIN t2
       ON t1.ID = t2.ID
      AND t2.Employer != 'NBC'
UNION
SELECT    *
FROM      t1
LEFT JOIN t2
       ON t1.ID = t2.ID
      AND t2.Employer IS NULL

结果集中的字符串操作
如果您只想将NBC作为字符串删除,这里有一个解决方法:
SELECT
    t1.*,
    IF (t2.Employer = 'NBC', NULL, t2.Employer) AS Employer
FROM t1
LEFT JOIN t2
    ON t1.id = t2.id

这基本上用"NBC"代替NULL

10-04 12:18