Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用内部联接从单个表中删除行_Mysql - Fatal编程技术网

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

Mysql 使用内部联接从单个表中删除行,mysql,Mysql,我在从MySQL数据库中删除行时遇到困难。我有两张桌子要加入。加入可能不是最好的解决办法,我当然愿意接受建议。各表如下: Table a 零件号、cat代码、说明 Table b 零件号、cat代码、说明 表b是正确的表,其内容最近已更新。表b只有一条产品线。表a列出了该公司目前和以前生产的所有产品线。表a列出了重复的旧数据和零件号,并与多个cat_代码关联 正确地说,cat_代码应该与零件编号具

我在从MySQL数据库中删除行时遇到困难。我有两张桌子要加入。加入可能不是最好的解决办法,我当然愿意接受建议。各表如下:

     Table a                                     
零件号、cat代码、说明

      Table b
零件号、cat代码、说明

表b是正确的表,其内容最近已更新。表b只有一条产品线。表a列出了该公司目前和以前生产的所有产品线。表a列出了重复的旧数据和零件号,并与多个cat_代码关联

正确地说,cat_代码应该与零件编号具有一对多关系。例如零件编号123456和789可以具有1A的cat_代码。两个表的主键都是零件编号+cat_代码

当我运行这个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
但是,当我试图在deletefrom语句中使用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)
任何帮助都将不胜感激,谢谢

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)
    )
有关删除的更多信息,请参阅MySql。具体而言,对于单个表,语法为:


您应该能够使用连接执行删除操作-除非我缺少以下内容:

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

它给出了什么错误?它没有给出错误,只返回没有受影响的行。我将在下一个表比较和更新中尝试这一点。我所做的工作是创建一个单列表,然后将第一次查询的结果插入表中。插入键选择CONCATa.part_编号,a.cat_代码从b内部连接a,其中a.part_编号=b.part_编号和a.cat_代码!=b、 cat_代码;然后,我刚刚使用键表进行了删除比较。我有更多的产品线要测试,所以我也将尝试您的方法。看来你的方法是最优雅的。谢谢你的意见。我将把我所有的结果都发回这个帖子。
DELETE a
FROM a
INNER JOIN b
ON b.part_number = a.part_number
AND a.cat_code != b.cat_code