Postgresql

具有相關子查詢的別名

  • March 23, 2014

我正在查看一個帶有 PostgreSQL 書中別名的相關子查詢範例:

bpsimple=# SELECT * FROM orderinfo o,
bpsimple=# (SELECT * FROM customer c WHERE town = 'Bingham') c
bpsimple=# WHERE c.customer_id = o.customer_id;

為什麼c這裡使用了兩次別名?括號裡面的還不夠嗎?

正如@ypercube 已經解釋的那樣,子查詢沒有引用外部查詢中的列,它可以獨立處理。所以它不是“相關子查詢”。有些人稱之為“派生表”,或者只是“子查詢”。

SELECT *
FROM   orderinfo o
   , (SELECT * FROM customer **c1** WHERE town = 'Bingham') **c2**
WHERE  c2.customer_id = o.customer_id;

至於你的問題:

  • c1``customer是子查詢中的表別名,是customer AS c1. 關鍵字AS已被省略,這很好,因為它只是別名的噪音。我引用了“省略 AS 關鍵字”的手冊:

FROM項目中,標準和 PostgreSQL 都允許AS在作為非保留關鍵字的別名之前省略。但這對於輸出列名是不切實際的,因為語法歧義

該範例可能是為了展示可見性:在外部子句中僅外部表別名可見,因此與used twoWHERE沒有命名衝突。 否則,這裡沒有用,因為沒有任何東西涉及它。你可以扔掉它。c
c1

  • c2是“派生表”的另一個表別名。這是強制性的,因為 Postgres 需要為每個使用的表命名,而子查詢在您命名之前沒有。

範例總體上不是很好。這樣的查詢應該使用顯式的 JOIN 子句,而子查詢毫無用處。這會更好、更短、更快:

SELECT *
FROM   orderinfo
JOIN   customer  c USING (customer_id)
WHERE  c.town = 'Bingham';

唯一的區別:在結果customer_id中列出一次而不是兩次(由於USING子句),這將是可取的,因為在這種情況下它是完全多餘的。

手冊SELECT中有關.

引用自:https://dba.stackexchange.com/questions/61449