Postgresql

左連接同一張表 - Postgres 9.2

  • December 12, 2016

我有這張桌子:

CREATE TABLE clients (
 id       BIGSERIAL NOT NULL,
 company  CHARACTER VARYING(255) DEFAULT '' NOT NULL,
 email    CHARACTER VARYING(50) DEFAULT '' NOT NULL,
 city     CHARACTER VARYING(80),            
 postcode CHARACTER VARYING(20),
);

我得到了城市和郵政編碼的列表。我需要查找是否有任何行與我擁有的數據匹配:

City,Zipcode
Lansdowne,2163
Villawood,2163
Smithfield,2164

我正在使用這個查詢;我怎樣才能達到預期的結果?

SELECT 
   t1.id,
   t1.city,
   t1.company,
   t1.postcode
FROM 
   clients t1 
LEFT JOIN 
   clients t2 ON t2.city = t1.city
LEFT JOIN 
   clients t3 ON t3.postcode = t1.postcode
WHERE t2.city IN ('Lansdowne','Villawood','Smithfield',) 
AND t3.postcode IN ('2164','2163','2163',)

查詢是否正確?

查詢是否正確?

**不會。**它會找到給定城市和郵政編碼的任意組合(例如 ('Smithfield', '2163')。對於一個查詢中的更多組合,這種笛卡爾積將變得越來越昂貴和荒謬。

並且查詢本身是不必要的昂貴和令人困惑的。LEFT JOIN被放錯地方並且不需要連接。

在多行(多列值的組合)上進行匹配的最短、最簡潔和最快的方法是連接到一個**VALUES**表達式(它是一個臨時表表達式):

SELECT id, city, company, postcode
FROM   clients
JOIN  (
  VALUES
  ('Lansdowne' , '2163')
, ('Villawood' , '2163')
, ('Smithfield', '2164')
  ) v(city, postcode) USING (city, postcode);

對於一個大表,為了加快速度,你應該有一個索引,(city, postcode)反之亦然,或者至少有一個以這兩個作為前導列的索引。

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