【发布时间】:2015-09-11 05:56:01
【问题描述】:
如果我有两个要加入的表,我会编写最简单的查询,如下所示:
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 与相似的 ID 相关联,但与我希望看到的一些活动相关联——因此是上面的SELECT *。虽然如果Employer 列是“NBC”,我不希望返回多行——但其他一切都很好。
这里唯一重要的另一件事是t2 小于t1,因为t1 是每个人,t2 仅来自从事特定活动的人——所以有些比赛不会从t2返回任何东西,但我仍然希望它们被返回,因此LEFT JOIN。
如果我这样写查询:
SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE Employer <> "NBC"
然后它会完全删除 Jerry 和 George —— 而我真正想要的只是不返回 NBC 行,而是返回与它们关联的任何其他行。
如何在将 t1 与 t2 连接时编写查询以返回除 NBC 之外的每一行?理想的输出将是来自t1 的所有行,无论它们是否与t2 的所有行匹配,除非在返回文件中删除所有以“NBC”为雇主的行。基本上,这里的理想是在适合的地方返回 JOIN,但无论如何删除以“NBC”为雇主的任何人的整行而不删除他们的其他行。
我写得越多,似乎我应该在JOIN 之前运行一个查询,以删除t1 中所有以“NBC”为雇主的行,然后运行正常查询。
【问题讨论】:
-
那么您希望这个查询做什么输出?
-
@Mureinik 很抱歉没有包括在内 - 理想的输出将是来自
t1的所有行,无论它们是否与所有t2匹配,除了删除所有带有“NBC”的行"作为返回文件中的雇主。 -
Ryan, “我写的越多,似乎我应该在我的 JOIN 之前运行一个查询,以删除 t1 中所有以“NBC”为雇主的行然后运行正常查询。” - NO!! :-)) MySQL 能够在两个条件下使用
SELECT应用任何可应用于数据集的逻辑:1. 您的数据格式正确 2. 您的要求很明确。我认为您已经接近可行的解决方案,现在不要放弃! -
@DanFromGermany 谢谢!好的,我不会!
标签: mysql sql-server join left-join