如何引用具有相同名称的字段而不包含别名

时间:2017-02-08 15:04:50

标签: sql postgresql

我的查询比这更大:

SELECT  ap.car_id, rs.car_id, ..... ap.*, rs.*
FROM    avl_pool  ap
JOIN    route_sources rs
 ON     ap.avl_id = rs.avl_id_begin

enter image description here

正如您所看到的,我得到两个名为car_id的列具有相同的值并且没有问题。不明白为什么在这里不会给我一个模棱两可的错误。

我可以这样做并且正常工作:

SELECT *
FROM (
      SELECT  ap.car_id, rs.car_id
      FROM    avl_pool  ap
      JOIN    route_sources rs
        ON     ap.avl_id = rs.avl_id_begin
     ) T

但这让我含糊不清car_id

SELECT car_id
FROM (
     SELECT  ap.car_id, rs.car_id
     FROM    avl_pool  ap
     JOIN    route_sources rs
      ON     ap.avl_id = rs.avl_id_begin
     ) T

当然我可以在每个字段中包含别名,但正如我所说,有很多列。那么我可以在不包含别名的情况下引用该列吗?它们具有相同的价值,因此不关心使用哪一个。

1 个答案:

答案 0 :(得分:2)

原因是select中的列名称 - 查询的一部分不需要是唯一的,但是对列的任何引用(例如在表达式或另一个(子)查询中)都不能是不明确的。

所以以下陈述是可以的:

select id, somecolumn as id from test
--> OK.

但是,以下查询将不起作用,因为对名为id的列的引用无法明确地绑定到子查询的第一列或第二列:

select id from (select id, somecolumn as id from test) t2

--> "42702: column reference "id" is ambiguous"

请注意,select *...将起作用,因为这些列不会被(可能是模糊的)名称引用:

select * from (select id, somecolumn as id from test) t2
--> OK.