Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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 是否删除一个表中存在而另一个表中不存在的数据?_Sql_Tsql_Informix - Fatal编程技术网

Sql 是否删除一个表中存在而另一个表中不存在的数据?

Sql 是否删除一个表中存在而另一个表中不存在的数据?,sql,tsql,informix,Sql,Tsql,Informix,我想选择在特定表中存在而在另一个表中不存在的所有行来删除它们 我编写了以下查询,但我发现两个表中都存在行 SELECT UNIQUE b.values_key FROM request_fo a INNER JOIN rm_trans b ON b.values_key != a.req_year || ',' || a.req_ser AND b.taskcode = 19 AND b.values_key IS NOT NULL AND a.req_year IS NOT NULL

我想选择在特定表中存在而在另一个表中不存在的所有行来删除它们

我编写了以下查询,但我发现两个表中都存在行

SELECT  UNIQUE b.values_key FROM request_fo a INNER JOIN rm_trans  b 
ON b.values_key != a.req_year || ',' || a.req_ser
AND b.taskcode = 19
AND  b.values_key IS NOT NULL
AND a.req_year IS NOT NULL 
AND a.req_ser IS NOT NULL

我想使用以下命令删除
request\u fo
中存在的数据和
rm\u trans中不存在的数据:

DELETE request_fo 
FROM request_fo a
INNER JOIN
rm_trans  b 
ON b.values_key != a.req_year || ',' || a.req_ser
AND b.taskcode = 19
AND  b.values_key IS NOT NULL
AND a.req_year IS NOT NULL 
AND a.req_ser IS NOT NULL

这是正确的吗?

下面是T-SQL语法:

WHERE
子句中使用
LEFT JOIN
代替
b。values\u键为NULL
谓词,在
DELETE
子句中使用别名
a
代替表名:

DELETE a 
FROM request_fo a
LEFT JOIN rm_trans  b  ON b.values_key = a.req_year + ',' + a.req_ser
                      AND b.taskcode = 19
WHERE  b.values_key IS  NULL;
请在此处查看它的实际操作:

假设
req\u ser
req\u year
是数据类型字符串,如果它们是整数,则将它们转换为整数


它是如何工作的?

LEFT JOIN
将包括第一个表
request\u fo
中不匹配的行,该表位于
LEFT JOIN
的左侧,即使没有满足
JOIN
条件的条目,在这种情况下,对于那些不匹配的行,
value键
值将为
NULL


例如,请参阅,第一个表中的
2013 4
在第二个表中不存在,因此它的
值\u键将为
NULL
,因此添加将为您提供在第一个表中找到而在第二个表中找不到的值。

如果您不能使用连接语法,也可以使用子选择

delete from t1
where t1 = something
and not exists
(
   select 1
   from t2
   where t1.key = t2.key
)

当你想执行这种操作时,你必须集中思考。您正在使用
=当您需要
不在(…)
不存在(…)

你的子句
b.values\u key!=a、 req|year | | a.req|ser
正在将
a
中的每一行与
b
中的每一行进行比较。在大多数情况下,它们并不相等。但是,在许多例子中,这一行中的
值_键
a.req | year | | | | | | a.req _ser
的其他行中的
a
相匹配。这就是为什么返回的数据确实存在于两个表中

您想尝试以下方法:

DELETE FROM a
  WHERE NOT EXISTS (SELECT 1 FROM b
                    WHERE b.values_key = a.req_year || ',' || a.req_ser
                       AND b.task_code = 19)

您还应该作为
SELECT*从不存在的位置(…)
运行它,以首先验证它。我会的。

为什么设置
b.values\u键为空?!不同的数据库管理系统对删除操作有不同的语法,尤其是带连接的删除操作。您不能自动期望在MS SQL Server中工作的东西在Oracle、DB2、Informix、MySQL、PostgreSQL中工作-它通常在Sybase中工作,但不一定在Sybase中工作。@JonathanLeffler:那么,从请求中删除a的语法是什么,'+a.req_ser和b.taskcode=19,其中b.values_key为空