Postgresql
具有相關子查詢的別名
我正在查看一個帶有 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 two
WHERE
沒有命名衝突。 否則,這裡沒有用,因為沒有任何東西涉及它。你可以扔掉它。c
c1
c2
是“派生表”的另一個表別名。這是強制性的,因為 Postgres 需要為每個使用的表命名,而子查詢在您命名之前沒有。該範例總體上不是很好。這樣的查詢應該使用顯式的 JOIN 子句,而子查詢毫無用處。這會更好、更短、更快:
SELECT * FROM orderinfo JOIN customer c USING (customer_id) WHERE c.town = 'Bingham';
唯一的區別:在結果
customer_id
中列出一次而不是兩次(由於USING
子句),這將是可取的,因為在這種情況下它是完全多餘的。手冊
SELECT
中有關.