使用内部联接从单个表中删除行

时间:2012-02-18 00:31:10

标签: mysql

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

     Table a                                     

part_number,cat_code,description

      Table b

part_number,cat_code,description

表b是其内容最近更新的正确表。表b只有一个产品系列。表a包含公司当前和之前制作的所有产品系列。表a具有重复的旧数据和part_numbers,并与多个cat_codes相关联。

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)

感谢任何帮助

2 个答案:

答案 0 :(得分:0)

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]

答案 1 :(得分:0)

你应该可以用连接删除 - 除非我遗漏了一些东西:

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