Postgresql
左連接同一張表 - Postgres 9.2
我有這張桌子:
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)
反之亦然,或者至少有一個以這兩個作為前導列的索引。