Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
Sql 在WHERE子句中使用字段的组合_Sql - Fatal编程技术网

Sql 在WHERE子句中使用字段的组合

Sql 在WHERE子句中使用字段的组合,sql,Sql,我有两个具有类似关键字段的表: TABLE_A (KEY1, KEY2, KEY3, KEY4, A, B, C ...) TABLE_B (KEY1, KEY2, KEY3, KEY4, A, B, C ...) 我想从表_B中删除记录,其中表_A中不存在键集。因此,类似于: DELETE FROM TABLE_B WHERE (KEY1, KEY2, KEY3, KEY4) NOT IN ( SELECT KEY1, KEY2, KEY3, KEY4 FROM TABLE_A ) 最

我有两个具有类似关键字段的表:

TABLE_A (KEY1, KEY2, KEY3, KEY4, A, B, C ...)
TABLE_B (KEY1, KEY2, KEY3, KEY4, A, B, C ...)
我想从表_B中删除记录,其中表_A中不存在键集。因此,类似于:

DELETE FROM TABLE_B 
WHERE (KEY1, KEY2, KEY3, KEY4) 
NOT IN ( SELECT KEY1, KEY2, KEY3, KEY4 FROM TABLE_A )
最好的方法是什么?它会是某种类型的连接吗?我对SQL有基本的了解,但是当涉及到这些类型的函数时,它开始变得模糊起来


谢谢

一个子选择就可以了

DELETE b FROM TABLE_B b
LEFT JOIN TABLE_A a ON a.KEY1=b.KEY1 AND a.KEY2=b.KEY2...
WHERE a.SOMEID IS NULL
DELETE FROM
   TABLE_B B
WHERE
   NOT EXISTS (SELECT *
               FROM TABLE_A A
               WHERE
                    A.KEY1 = B.KEY1 AND
                    A.KEY2 = B.KEY2 AND
                    A.KEY3 = B.KEY3 AND
                    A.KEY4 = B.KEY4
               );

您的SQL是有效的标准SQL:1992语法,是一种很好的方法


当然,并非所有SQL产品都支持该语法,例如,and支持该语法,不单击这些链接了解详细信息。

这显然是无效的SQL-不,事实上,某些数据库完全按照您编写该语法的方式接受该语法。如果您可以添加有关正在使用的数据库的信息,这会有所帮助。您正在从错误的表中删除错误的记录。该问题要求从表_B中删除表_A中不存在的记录。您正在从表_B中删除表_A中确实存在的记录。不,我不这样认为。左侧连接选择所有行,而where则过滤掉A中不存在的行。@hvd-否,这是右侧。WHERE u为NULL称为排除联接,它将完全执行OP所需的操作。@StefanMai您编辑了答案,使其正确,这很好,但我对原始答案进行了评论。@JoelCoehoorn我评论的原始答案已从中删除了一个。。。内部连接。。。