Mysql 删除一个表中与另一个表中的行不匹配的行
我知道以前有人问过这个问题,但给出的解决方案假设id为单列关系。我尝试过适应,但给出的解决方案对我的案例不起作用 最新消息:我一定是把头抬得离自己的屁股太远了,以至于我被转过身来。回顾文档和其他代码,我发现我的问题和意图应该是删除一个表中与另一个表中的行匹配的行。这个问题回答起来容易多了,而且我已经做到了 我有两个MySQL INNODB表——clas和clas_import——它们有几个共同的列。我正在将CSV导入clas_导入,我想删除clas_导入中不存在的clas中的任何行 clas_导入的定义如下:Mysql 删除一个表中与另一个表中的行不匹配的行,mysql,sql,Mysql,Sql,我知道以前有人问过这个问题,但给出的解决方案假设id为单列关系。我尝试过适应,但给出的解决方案对我的案例不起作用 最新消息:我一定是把头抬得离自己的屁股太远了,以至于我被转过身来。回顾文档和其他代码,我发现我的问题和意图应该是删除一个表中与另一个表中的行匹配的行。这个问题回答起来容易多了,而且我已经做到了 我有两个MySQL INNODB表——clas和clas_import——它们有几个共同的列。我正在将CSV导入clas_导入,我想删除clas_导入中不存在的clas中的任何行 clas_导
+-----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| term | smallint(4) unsigned | NO | | NULL | |
| subject | varchar(10) | NO | | 0 | |
| catalog | smallint(5) unsigned | NO | | 0 | |
| component | varchar(10) | NO | | 0 | |
| section | varchar(5) | NO | | 0 | |
+-----------+----------------------+------+-----+---------+----------------+
clas有更多的列,但id、term等列的定义与上面的相同
唯一类由术语+主题+目录+组件+节的组合定义。所以我想找到clas中与clas_导入中的条目不匹配的所有条目,并将其删除。更重要的是,并不是所有的行都被比较——只有那些术语行与某些值匹配的行才被比较
示例数据:
clas_进口
clas列被截断,仅显示相关数据
+----+------+---------+---------+-----------+---------+
| id | term | subject | catalog | component | section |
+----+------+---------+---------+-----------+---------+
| 23 | 1730 | ENG | 102 | LEC | 1A04 |
| 26 | 1730 | BLA | 102 | LEC | 1A04 |
| 30 | 1730 | ENG | 100 | LEC | 1A04 |
| 11 | 1700 | ENG | 102 | LEC | 1A04 |
+----+------+---------+---------+-----------+---------+
预期结果:
我可以运行查询并删除第23行和第26行,同时保留第30行和第11行不变
我的问题是:
删去
来自“clas”`
哪里
`1730年的“术语”和
不存在
选择
1.
从…起
`clas_import`as`ci`
哪里
`clas`.`term`=`ci`.`term`和
`clas`.`subject`=`ci`.`subject`和
`clas`.`catalog`=`ci`.`catalog`和
`clas`.`component`=`ci`.`component`和
`clas`.`section`=`ci`.`section`
该查询不会删除任何内容。当我将DELETE更改为SELECT*时,不会返回任何行。这两个表都被填充,如果我对术语、主题等进行简单的查询匹配,我会得到返回的行,因此我知道数据是好的
故障在哪里
编辑这里有一个DBFIDLE:,还有其他事情发生。我的第一个猜测是检查空格的差异
但我只是在写了答案后才意识到,下面是你如何做得更干净一点
您希望只匹配clas中与clas\U导入中的行不匹配的行
,还有别的事。我的第一个猜测是检查空格的差异
但我只是在写了答案后才意识到,下面是你如何做得更干净一点
您希望只匹配clas中与clas\U导入中的行不匹配的行
通过使用问题中的样本数据和小提琴中的表格定义,我得到了您想要的结果,将NOT从EXISTS中删除,因此我猜您的逻辑是错误的:
DELETE
FROM `clas`
WHERE
`clas`.`term` IN (1730) AND
EXISTS(
SELECT
1
FROM
`clas_import` as `ci`
WHERE
`clas`.`term` = `ci`.`term` AND
`clas`.`subject` = `ci`.`subject` AND
`clas`.`catalog` = `ci`.`catalog` AND
`clas`.`component` = `ci`.`component` AND
`clas`.`section` = `ci`.`section`
)
看。
结果:
通过使用问题中的样本数据和小提琴中的表格定义,我得到了您想要的结果,将NOT从EXISTS中删除,因此我猜您的逻辑是错误的:
DELETE
FROM `clas`
WHERE
`clas`.`term` IN (1730) AND
EXISTS(
SELECT
1
FROM
`clas_import` as `ci`
WHERE
`clas`.`term` = `ci`.`term` AND
`clas`.`subject` = `ci`.`subject` AND
`clas`.`catalog` = `ci`.`catalog` AND
`clas`.`component` = `ci`.`component` AND
`clas`.`section` = `ci`.`section`
)
看。
结果:
请看@GMB,因为我说错了。谢谢-我会解决的。两个表之间字段的数据类型相同吗?您是否验证了这两个表中的字符串字段没有隐藏空格,甚至没有隐藏非打印字符?字符串字段是否具有相同的排序规则?@Uueero-相关字段相同。clas_导入是通过复制clas.BTW进行的,我打赌是空白。可能不是空格,而是类似\r\n的内容。如果您提供了详细信息,sql是什么?csv?xml?如果是加载数据命令,你导入数据可能会给我们一些线索。请看@GMB,因为我错了。谢谢-我会解决的。两个表之间字段的数据类型相同吗?您是否验证了这两个表中的字符串字段没有隐藏空格,甚至没有隐藏非打印字符?字符串字段是否具有相同的排序规则?@Uueero-相关字段相同。clas_导入是通过复制clas.BTW进行的,我打赌是空白。可能不是空格,而是类似\r\n的内容。如果您提供了详细信息,sql是什么?csv?xml?如果是加载数据命令,您导入数据可能会给我们一些线索。谢谢。这种格式与我发布的格式不一样。但是你的回答很清楚,我同意你的看法——我一定还有别的事情要做。@fifonik谢谢你对我问题的关注。正如我刚刚更新的,我的问题实际上与我发布的完全相反。再次感谢你的帮助,也很抱歉浪费了你的时间。谢谢。这种格式与我发布的格式不一样。但是你的回答很清楚,我同意你的看法——我一定还有别的事情要做。@fifonik谢谢你对我问题的关注。正如我刚刚更新的一样,我的问题实际上与我所想的完全相反
特德。再次感谢你的帮助,也很抱歉浪费了你的时间。谢谢。解决方案最终根本不需要子查询——只需要一些简单的WHERE条件。谢谢。解决方案最终根本不需要子查询——只需要一些简单的WHERE条件。
DELETE
FROM `clas`
WHERE
`clas`.`term` IN (1730) AND
EXISTS(
SELECT
1
FROM
`clas_import` as `ci`
WHERE
`clas`.`term` = `ci`.`term` AND
`clas`.`subject` = `ci`.`subject` AND
`clas`.`catalog` = `ci`.`catalog` AND
`clas`.`component` = `ci`.`component` AND
`clas`.`section` = `ci`.`section`
)
> id | term | subject | catalog | component | section
> -: | ---: | :------ | ------: | :-------- | :------
> 11 | 1700 | ENG | 102 | LEC | 1A04
> 30 | 1730 | ENG | 100 | LEC | 1A04