我希望,如果我写一个子查询,那么在 主查询在子查询中将不可用。这似乎不是 情况,我不明白为什么。
采用以下示例表并进行查询:
CREATE TABLE test_1 (
col_a TEXT
);
CREATE TABLE test_2 (
col_b TEXT
);
INSERT INTO test_1
VALUES
('Bob'),
('Tim')
;
INSERT INTO test_2
VALUES
('Sam'),
('Tim')
;
SELECT
col_a
FROM
test_1
WHERE col_a IN (SELECT col_a FROM test_2);
在子查询SELECT col_a FROM test_2
中,由于col_a
在表test_2
中不存在,我希望得到一个错误。相反,子查询从col_a
返回table_1
的内容。
我得到的输出是:
col_a
-------
Bob
Tim
我正在运行以下版本的PostgreSQL:
PostgreSQL 9.5.13 on x86_64-pc-linux-gnu
答案 0 :(得分:3)
查询中有多个表时,总是使用合格的表名。您认为查询正在执行:
SELECT t1.col_a
FROM test_1 t1
WHERE t1.col_a IN (SELECT t2.col_a FROM test_2 t2);
这将产生一个错误,因为t2.col_a
不存在。
但是,子查询的作用域规则指出,如果该列不在子查询中,则在外部查询中查找。因此,如果t2.col_a
不存在,则查询将变为:
SELECT t1.col_a
FROM test_1 t1
WHERE t1.col_a IN (SELECT t1.col_a FROM test_2 t2);
解决方案是对所有列引用进行限定,以免产生歧义。