代码之家  ›  专栏  ›  技术社区  ›  sharf

从另一个表中不存在值的表中删除

  •  0
  • sharf  · 技术社区  · 3 年前

    我有一张桌子( table_1 )我正在尝试从中删除,基于一个值是否不存在于另一个中( table_2 )

    表2 表1 ,例如:

    +----------+--------------+
    |table_1_id|table_2_active|
    +----------+--------------+
    |1         |0             |
    +----------+--------------+
    |1         |1             |
    +----------+--------------+
    |2         |0             |
    +----------+--------------+
    

    表2 链接 表1 active ,0表示“不活动”,1表示“活动”。

    我想从中删除 表1 (因此 表2 )其中没有“活动”条目 表2 .

    DELETE t1, t2 FROM `table_1` t1
    LEFT JOIN `table_2` t2 ON t1.id = t2.table_1_id
    WHERE t2.active = 0
    

    但是,这将删除具有“非活动”链接的内容,即使它仍然具有“活动”链接。例如,在上表中,我想删除where table_1_id 是2,而不是1。我也尝试过进入子查询,但是在从主查询获取要在子查询中使用的id时遇到问题,我必须相信有一种方法可以在没有子查询的情况下做到这一点。

    如何从中删除 表2 那里没有 积极的 = 1?

    1 回复  |  直到 3 年前
        1
  •  1
  •   Barmar    3 年前

    你需要反转 active 测试,并将其移动到 ON 条款。然后检查 WHERE 条款。

    DELETE t1 FROM `table_1` t1
    LEFT JOIN `table_2` t2 ON t1.id = t2.table_1_id AND t2.active = 1
    WHERE t2.table_1_id IS NULL
    

    table_1 这里,自从 LEFT JOIN 不包括中的任何现有行 table_2 table_1_id 声明为外键 ON DELETE CASCADE ,中的相关非活动行