【发布时间】:2013-12-16 04:17:46
【问题描述】:
假设有两个表:
Table A: A1, A2, A_Other
Table B: B1, B2, B_Other
在以下示例中, is something 是根据固定值检查的条件,例如 = 'ABC' 或 < 45。
我写了如下查询(1):
Select * from A
Where A1 IN (
Select Distinct B1 from B
Where B2 is something
And A2 is something
);
我真正想写的是(2):
Select * from A
Where A1 IN (
Select Distinct B1 from B
Where B2 is something
)
And A2 is something;
奇怪的是,两个查询都返回了相同的结果。在查看查询1的说明计划时,看起来像执行子查询时,因为条件A2 is something不适用于子查询,它是deferred 用作主要查询结果的过滤器。
我通常认为查询 1 会失败,因为子查询本身会失败:
Select Distinct B1 from B
Where B2 is something
And A2 is something; --- ERROR: column "A2" does not exist
但我发现情况并非如此,Postgres 将不适用的子查询条件推迟到主查询。
这是标准行为还是 Postgres 异常? 这在哪里记录,这个功能叫什么?
另外,我发现如果我在表 B 中添加一列 A2,则只有查询 2 可以按最初的预期工作。在这种情况下,查询 2 中的引用 A2 仍将引用 A.A2,但查询 1 中的引用将引用新列 B.A2,因为它现在可以直接在子查询中应用。
【问题讨论】:
-
这是一个相关子查询。
-
这似乎不对,因为我没有真的使用主查询中的值来过滤子查询中的结果(这是相关子查询所做的)。此处的过滤器仍应用于主查询。但是,是的,可能就是这样。 顺便说一句,一个详细的答案解释正在发生的事情会很好。
-
A2 是什么东西或 B2 是什么东西不清楚。这取决于那个。我认为凭借一些记录,您可以从两个查询中获得相同的结果。
-
@KumarHarsh 添加了一个解释该部分的注释。这是对固定值的简单检查。另外,令人费解的部分是不是两个查询都返回相同的结果,而是第一个没有失败。
-
关联子查询 1) 使用来自外部查询的值,并且 2) 对外部查询中评估的每一行执行一次。这两个功能可能与过滤结果有关,也可能无关。 (相关子查询可以出现在 SELECT 子句中。)
标签: sql postgresql subquery postgresql-9.1 in-subquery