我想我刚刚发现了 DB2 本身的一个错误。当我运行此代码时,我希望它在执行删除语句时抛出错误(子选择错误地使用 A_NAME 而不是 NAME)。但是:它的行为就像没有 where 子句一样,并删除表 NAMES 中的所有行!
CREATE TABLE NAMES (A_NAME VARCHAR(20));
CREATE TABLE OLDNAMES (NAME VARCHAR(20));
INSERT INTO NAMES VALUES ('ANNA'), ('ELLA'), ('JOHN'), ('EARL');
INSERT INTO OLDNAMES VALUES ('ELLA'), ('EARL');
-- this should throw an error message:
DELETE FROM NAMES WHERE A_NAME IN (SELECT A_NAME FROM OLDNAMES);
-- this should show ANNA & JOHN if the subselect
-- was correct, but shows nothing
SELECT * FROM NAMES;
-- cleanup
DROP TABLE NAMES;
DROP TABLE OLDNAMES;
我在 DB2/LINUXX8664 10.5.9 上运行它
或者“不是错误,而是功能”?!
最佳答案
你错了。 SQL 具有用于解析子查询中的列引用的作用域规则。如果内部查询中未解析列引用,则会查找外部查询。
这些是 SQL 规则,并非特定于 DB2。
SQL 将你的逻辑解释为:
DELETE FROM NAMES
WHERE NAMES.A_NAME IN (SELECT NAMES.A_NAME FROM OLDNAMES ON);
这是有效的——如果没有意义的话——SQL。
这就是为什么建议限定所有列引用的原因。编写此查询的更好方法是:
DELETE FROM NAMES
WHERE NAMES.A_NAME IN (SELECT ON.A_NAME FROM OLDNAMES ON);
关于sql - DB2错误: SQL subselect error not recognized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59896350/