繁体   English   中英

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

[英]MySQL: How to Remove One Row of a Multi-Row Record Based on Column

如果我有两个表,我正在加入,我写的最简单的查询可能是这样的:

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行不被返回,而是返回与它们相关联的任何其他行。

如何在使用t2加入t1时写入查询以返回除NBC之外的每一行? 理想的输出是来自t1所有行,无论它们是否与t2所有行匹配,除了在返回文件中删除所有以“NBC”作为雇主的行。 基本上这里的理想是返回它们适合的JOIN,但无论如何将“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

这基本上用NULL替换"NBC"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM