2011-01-20 58 views
0

繼續我發佈的問題 Can my use case explained be solved in a single query without affecting performance?,我現在有不同的要求,我想知道這是否可以在單個查詢中再次解決而不影響性能。我的新要求說明如下:該查詢可以解決嗎?

有2臺參與:

Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6) 
Table 2: EMAILLIST (email) 

我的新的要求是,如果 EMPLOYEE.EMAIL1和EMPLOYEE.EMAIL2擁有的emailList表中的匹配項,那麼該行應該被忽略。因此,如果EMPLOYEE.EMAIL1或EMPLOYEE.EMAIL2中沒有匹配的條目(這意味着至少有一列有匹配的條目),我預計應該返回這一行。由於任一電子郵件沒有匹配的條目,因此我需要在SELECT子句本身中標識哪個電子郵件(email1或email2)在EMAILLIST表中沒有匹配的條目。

例子:

INSERT INTO EMAILLIST (email) VALUES ('[email protected]'); 
INSERT INTO EMPLOYEE (column1, column2, email1, email2, column5, column6) VALUES ('c1', 'c2', '[email protected]', '[email protected]', 'c5', 'c6'); 

我希望在查詢輸出一些標識上的電子郵件的一個沒有匹配項這樣的返回:

EMAIL1   | EMAIL2   | EMAIL1MATCHED | EMAIL2MATCHED 
[email protected] | [email protected] | Yes   | No 

我們使用PostgreSQL v8.2.3,如果它很重要。

UPDATE:我的表大小的小巨大的:員工已得到165018條記錄和的emailList得到了1810228條記錄

回答

1

前提是emaillistemail列索引,這應該是罰款:

SELECT employee.email1, employee.email2, 
     e1.email IS NOT NULL AS email1_matched, e2.email IS NOT NULL AS email2_matched 
    FROM employee 
    LEFT JOIN emaillist e1 ON e1.email = employee.email1 
    LEFT JOIN emaillist e2 ON e2.email = employee.email2 
WHERE e1.email IS NULL OR e2.email IS NULL 
0
SELECT * 
FROM (
     SELECT email1, email2, 
       email1 IN 
       (
       SELECT email 
       FROM emaillist 
       ) AS email1matched, 
       email2 IN 
       (
       SELECT email 
       FROM emaillist 
       ) AS email2matched 
     FROM employee 
     ) q 
WHERE email1matched <> email2matched 
+0

運行此查詢時,系統正在收到`ERROR:寫入失敗的SQL狀態:XX000`。我的表格大小不大:EMPLOYEE有165018條記錄,EMAILLIST有1810228條記錄。 – Gnanam 2011-01-21 05:01:49