【问题标题】:Get rows in multiple tables that don't have a match in one single table获取多个表中在一个表中没有匹配项的行
【发布时间】:2021-09-13 21:15:30
【问题描述】:

表 A 有一个 id,表 B、C、D、E、F 有一个不可为空的 (a_id) 列。 但是没有PK/FK。

试图在表 B、C、D、E、F 中查找所有单独的行,其中 a_id 是与表 A 中的任何行都不匹配的值。

例子:

表 A |身份证 |福 | | -- | -- | | 123 |酒吧 1 | | 124 |酒吧 2 | | 125 |酒吧 3 |

表 B |身份证 | A_ID | | -- | -- | | 1 | 123 | | 2 | 125 | | 3 |第999章|

表 C |身份证 | A_ID | | -- | -- | | 4 | 124 | | 5 | 125 | | 6 |第888章|

表 D |身份证 | A_ID | | -- | -- | | 7 | 124 | | 8 | 125 | | 9 |第777章|

表 E |身份证 | A_ID | | -- | -- | | 10 | 124 | | 11 | 125 | | 12 |第666章|

表 F |身份证 | A_ID | | -- | -- | | 13 | 124 | | 14 | 125 | | 15 |第555章|

我需要一个选择结果

结果

A_ID B_ID C_ID D_ID E_ID F_ID
NULL 3 NULL NULL NULL NULL
NULL NULL 6 NULL NULL NULL
NULL NULL NULL 9 NULL NULL
NULL NULL NULL NULL 12 NULL
NULL NULL NULL NULL NULL 15

【问题讨论】:

  • 您能否添加更多详细信息、表格描述、一些插入内容和您的预期结果?
  • 添加了上下文和表格
  • 你检查我的答案了吗?如果您觉得它有帮助,请不要忘记点赞并标记为已接受的答案,以便其他人可以从中学习
  • @basha04 我做到了。通过在语句中将它们列为字符串来伪造一系列条目不是解决方案
  • 阅读更多关于right join的信息然后你就会明白这不是伪造的,它是一个使用 union all 的简单正确的解决方案。请指出伪造在哪里?

标签: mysql


【解决方案1】:

编辑:根据要求,我使用 UNION 重写了将所有表耦合到一个语句中的语句。

    SELECT a.id
    FROM   Table A
    WHERE  NOT EXISTS (SELECT B.rowname
                       FROM   Table B
                       WHERE  B.rowname = a.id
                       UNION SELECT C.rowname
                       FROM   Table C
                       WHERE  C.rowname = a.id
                       UNION SELECT D.rowname
                       FROM   Table D
                       WHERE  D.rowname = a.id
                       UNION SELECT E.rowname
                       FROM   Table E
                       WHERE  E.rowname = a.id
                       UNION SELECT F.rowname
                       FROM   Table F
                       WHERE  F.rowname = a.id )
                       

早安,

我自己对 mysql 有点陌生。但是我做了一些研究并设法找到了一个依赖于 NOT EXISTS 的代码解决方案。让我知道这种方法是否适合您。

    SELECT a.id
    FROM   Table A
    WHERE  NOT EXISTS (SELECT B.rowname
                       FROM   Table B
                       WHERE  B.rowname = a.id)

【讨论】:

  • 只涵盖表A和B,忽略其余表。
  • 是的,这是真的。您必须想出一个涵盖所有表的表达式,可能使用 UNION 运算符。 SELECT B.rowname FROM Table B WHERE B.rowname = a.id UNION SELECT C.rowname FROM Table C WHERE C.rowname = a.id
  • 我希望这行得通。也许那里有更多漂亮的解决方案,我自己对 mysql 很陌生!
  • @BrakkeBavian 根据预期结果它不起作用,因为您只选择一列,您必须为每个表结果创建一列。查看我的回答是否有助于您了解有关 mysql 的一些新内容,如果您觉得有帮助,请点赞。
  • @basha04 感谢您详细说明!我会快速看一下演示,但它肯定很有帮助!
【解决方案2】:

用途:

select a.id as "a.id", b.id as "b.id","NULL" as "c.id","NULL" as "d.id","NULL" as "e.id","NULL" as "f.id" from a right join b on a.id=b.a_id where a.id is null 
UNION ALL
select a.id,"NULL",c.id,"NULL","NULL","NULL" from a right join c on a.id=c.a_id where a.id is null 
UNION ALL
select a.id,"NULL","NULL",d.id,"NULL","NULL" from a right join d on a.id=d.a_id where a.id is null 
UNION ALL
select a.id,"NULL","NULL","NULL",e.id,"NULL" from a right join e on a.id=e.a_id where a.id is null 
UNION ALL
select a.id,"NULL","NULL","NULL","NULL",f.id from a right join f on a.id=f.a_id where a.id is null ;

演示:https://www.db-fiddle.com/f/7yUJcuMJPncBBnrExKbzYz/20

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 2022-11-04
    • 2019-05-29
    • 2017-07-24
    • 2016-03-12
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2014-12-26
    相关资源
    最近更新 更多