【问题标题】:Deleting rows from single Table using inner Join使用内部联接从单个表中删除行
【发布时间】:2012-02-18 00:31:09
【问题描述】:

我在从 MySQL 数据库中删除行时遇到困难。我有两个要加入的表。加入可能不是最好的解决方案,我绝对愿意接受建议。表格如下

     Table a                                     

part_number、cat_code、description

      Table b

part_number、cat_code、description

表 b 是其内容最近更新的正确表。表 b 只有一个产品线。表 a 包含公司当前和以前制造的所有产品线。表 a 包含重复的旧数据和零件编号,并与多个 cat_code 相关联。

cat_codes 应该和 part_numbers 是一对多的关系。例如 part_number 123,456 和 789 的 cat_code 可以是 1A。两个表的主键都是 part_number+cat_code

当我运行这个 select 语句时,我得到了我需要从表 a 中删除的唯一标识符的输出。

SELECT CONCAT(a.part_number,a.cat_code)
FROM
b
INNER JOIN
a 
WHERE
a.part_numer = b.part_number
AND a.cat_code != b.cat_code

但是当我尝试在 DELETE FROM 语句中使用该 select 语句时,它不起作用。这是损坏的声明。

DELETE FROM
a
WHERE
CONCAT(part_number,cat_code) IN (SELECT CONCAT(a.part_number,a.cat_code)
FROM
b
INNER JOIN
a 
WHERE
a.part_numer = b.part_number
AND a.cat_code != b.cat_code)

任何帮助将不胜感激,谢谢

【问题讨论】:

  • 它给出了什么错误?
  • 没有错误,只返回不受影响的行。

标签: mysql


【解决方案1】:

DELETE 命令没有IN 参数,因此您需要在子查询周围加上括号。试试:

DELETE FROM a 
WHERE (
    CONCAT(part_number,cat_code) 
    IN (SELECT CONCAT(a.part_number,a.cat_code) 
        FROM b INNER JOIN a WHERE a.part_numer = b.part_number 
          AND  a.cat_code != b.cat_code)
    )

有关DELETE 的更多信息,请参阅MySql documentation。特别是,对于单个表,语法是:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

【讨论】:

  • 我将在下一个表比较和更新中尝试这个。我所做的工作是创建一个单列表,然后将我的第一个查询的结果插入表中。 INSERT INTO key SELECT CONCAT(a.part_number,a.cat_code) FROM b INNER JOIN a WHERE a.part_numer = b.part_number AND a.cat_code != b.cat_code;然后我只是使用键表来比较删除。
【解决方案2】:

你应该可以通过连接来删除——除非我遗漏了什么:

DELETE a
FROM a
INNER JOIN b
ON b.part_number = a.part_number
AND a.cat_code != b.cat_code

【讨论】:

  • 我有更多的产品线要测试,所以我也会试试你的方法。看起来你的方法是最优雅的。谢谢您的意见。我会将我所有的结果发回这个线程。
猜你喜欢
  • 2016-10-21
  • 1970-01-01
  • 2017-12-22
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多