为什么我可以从子查询中引用外部查询列?

时间:2018-08-10 21:14:39

标签: sql postgresql

我希望,如果我写一个子查询,那么在 主查询在子查询中将不可用。这似乎不是 情况,我不明白为什么。

采用以下示例表并进行查询:

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

1 个答案:

答案 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);

解决方案是对所有列引用进行限定,以免产生歧义。