MySQL:如何基于列删除多行记录中的一行

MySQL:如何基于列删除多行记录中的一行,mysql,sql-server,join,left-join,Mysql,Sql Server,Join,Left Join,如果我有两个要连接的表,并且我编写了最简单的查询,如下所示: SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id ID Name Employer 12345 Jerry Comedy Cellar 12345 Jerry NBC 12348 Elaine Pendant Publishing 12346 George Real

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

SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
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
SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE Employer <> "NBC"
有一些记录每个ID有多行,因为它们有多个雇主,所以t1如下所示:

SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
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
SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE Employer <> "NBC"
t2与类似的ID链接,但与我希望看到的一些活动关联——因此上面的SELECT*是。虽然我不希望在雇主列为NBC时返回多行,但其他一切都很好

这里唯一重要的另一件事是t2比t1小,因为t1是所有人,t2只来自做过特定活动的人-所以一些比赛不会从t2返回任何东西,但我仍然希望返回,因此是左连接

如果我这样写查询:

SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
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
SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE Employer <> "NBC"
然后它完全删除了Jerry和George,而我真正想要的是NBC行不被返回,而是返回与它们相关的任何其他行


如何在连接t1和t2以返回除NBC行以外的每一行时编写查询?理想的输出是t1中的所有行,无论它们是否与t2中的所有行匹配,但在返回文件中删除所有以NBC为雇主的行除外。基本上,这里的理想情况是在合适的位置返回连接,但无论如何,对于任何以NBC为雇主的人,都要删除整行,而不删除其他行

我写得越多,似乎我应该在加入之前运行一个查询,删除t1中所有以NBC为雇主的行,然后运行正常查询

基本子集过滤

通过扩展ON子句,可以过滤两个合并的联接子集中的任何一个

如果您现在得到空值,并且不想要它们,您应该添加:

WHERE t2.Employer IS NOT NULL
扩展逻辑:

使用联合

基本上,JOIN用于数据集的水平链接,UNION用于数据集的垂直链接

它合并到结果集:第一个结果集没有NBC,第二个结果集基本上是一个外部连接,将所有人添加到t1中,而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

那么您希望此查询的输出是什么?@Mureinik很抱歉没有包括这一点-理想的输出将是t1中的所有行,无论它们是否与t2中的所有行匹配,除了删除返回文件中以NBC为雇主的所有行。Ryan,我写得越多,似乎我应该在加入之前运行一个查询,删除t1中所有以NBC为雇主的行,然后运行正常查询。-不!!:-MySQL能够在两种情况下使用SELECT应用任何可应用于数据集的逻辑:1。你的数据格式正确。你的要求很清楚。我认为你已经接近一个有效的解决方案,现在不要放弃@丹妮:谢谢!好吧,我不会的!谢谢这是非常简单的,基本上就是我要找的。我唯一没有预料到的是,如果我在t1而不是t2中有人,例如,使左连接不从t2中添加任何出于我的目的所需的内容,它似乎不会删除以NBC为雇主的人,因为他们不属于连接。我能为实现这一点做些补充吗?我不完全理解您的要求,最好您在问题中提供示例输出。谢谢-我添加了口头理想输出,但如果仍然太模糊,我可以更具体。基本上,只要t1和t2有一个匹配的键,您的工作就很好。但是t1中有一些人不在t2中,这就是为什么我做了LEFT JOIN,但是你对LEFT JOIN语句的添加对于ID匹配的人很有效,但是如果t2中没有ID匹配的人,则似乎不起作用。@Ryan我又添加了3个解决方案。你可以用更多的逻辑来扩展这个子句。基本上,这里的理想是在合适的地方返回连接,但是不管怎样,对于任何以NBC为雇主的人,都可以删除整行,而不删除其他行。