sql - DB2错误: SQL subselect error not recognized

标签 sql db2

我想我刚刚发现了 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/

相关文章:

mysql - 创建一个带有外键自动增量的新表?

mysql - 如何在mysql查询中进行NOT NULL检查

sql - 使用 ActiveRecord 将 300M 行数据集插入 PostgreSQL

c# - 在连接字符串中为 DB2 查询指定模式/实例

java - 数据库查询挂到 DB2 服务器,在 java 代码中使用 tomcat 连接池

java - Hibernate 使用 BigDecimal 而不是 Integer

db2 - IBM DB2 SQL PL 中 'set' 和 'select into' 之间的差异

sql - 在 SELECT 子句中引用 FROM 子查询

mysql - 无法将结果集保存到 MySQL 中的变量中

java - 如何在没有 WSConnection 的情况下设置客户端信息