为什么括号在SELECT查询中工作但没有子查询?

时间:2016-02-13 03:10:35

标签: sql postgresql

为什么这是一个有效的查询

SELECT T.A FROM 
 (SELECT A, B  
  FROM  test) T ;

和此:

(SELECT DISTINCT(A,B)
      FROM  test);

但不是这样:

SELECT T.A FROM 
 (SELECT DISTINCT(A, B)  
  FROM  test) T ;

(特别是在postgresql中,但我也怀疑其他sql)?

更新:

Postgres失败了:

ERROR:  column t.a does not exist
LINE 1: SELECT T.A FROM 

将查询更改为

SELECT T.A FROM 
 (SELECT DISTINCT A, B  
  FROM  test) T ;

成功,

SELECT T.A FROM 
 (SELECT DISTINCT (A, B)  
  FROM  test) T ;

失败。为什么呢?

2 个答案:

答案 0 :(得分:4)

执行此操作时:

SELECT T.A FROM 
 (SELECT DISTINCT(A, B)  
  FROM  test) T ;

您的(A,B)语法导致该返回为record数据类型。因此,您的子查询(T)会看到匿名记录的行返回,而不是单个字段A和B.

如果没有括号,它们将被视为普通字段,这似乎是您想要的。

答案 1 :(得分:-1)

您必须从子查询中指定别名,否则无法从您的第一个seq查询中识别列名...

  SELECT T.A FROM 
     (SELECT DISTINCT(A, B) AS A
      FROM  test) T ;