2011-07-22 33 views
0

我有一個工作的查詢,將來自我的數據庫返回的一些結果(記錄),如:方式與同一ID查找行只保留一行

123|John Williams|IL|M|06/01/2011|ACTIVE 
124|Mary Haque|NY|F|TERMINATED|06/30/2011 
124|Mary Haque|NY|F|07/01/2011|ACTIVE 
125|Alex Chan|VA|07/01/2011|ACTIVE 
126|Rob Kreb|VA|TERMINATED|06/20/2011 

正如你所看到的,結果是隻是一個客戶記錄列表,而最後兩個字段則表示該成員是處於活動狀態還是終止狀態以及關聯的活動/終止日期。

現在的複雜情況是,您可以看到ID 124(Mary Haque)的成員,她有兩條記錄,對於這種雙記錄客戶,我只想保留該成員處於活動狀態的行而完全無視她終止的歷史。因此,例如,對於上述所需的輸出應該是:

123|John Williams|IL|M|06/01/2011|ACTIVE 
124|Mary Haque|NY|F|07/01/2011|ACTIVE 
125|Alex Chan|VA|07/01/2011|ACTIVE 
126|Rob Kreb|VA|TERMINATED|06/20/2011 

,你可以看到,現在瑪麗·哈克只有她的結果積極的信息。上面的結果是由SQL「Select」查詢生成的,但我不能簡單地將「WHERE status = ACTIVE」附加到此查詢中,因爲我仍想保留僅具有像Rob Kreb一樣記錄的成員,即使他終止。我只希望在某個成員有兩條記錄時進行TERMINATED成員記錄的過濾。

僅供參考,我目前的查詢如下所示:

SELECT * FROM customer_change WHERE CUSTOMER_LOGIN NOT IN(SELECT CUSTOMER_LOGIN FROM customer_full WHERE CUSTOMER_LOGIN IS NOT NULL) 
UNION 
SELECT * FROM customer_change WHERE CUSTOMER_POINTS=0 AND CUSTOMER_LOGIN NOT IN(SELECT CUSTOMER_LOGIN FROM customer_full WHERE CUSTOMER_POINTS=0 AND CUSTOMER_LOGIN IS NOT NULL) 

感謝您的幫助提前!

+2

爲什麼你將日期存儲爲字符串而不是日期? –

+0

修復標題以匹配您的問題。 –

+0

另外,儘量不要使用UNION,總會有更好的方法。 –

回答

2

colXcolY是查詢的最後2列:

SELECT * 
FROM (your_UNION_query) AS p 
WHERE NOT (colX = 'TERMINATED' 
      AND EXISTS 
      (SELECT * 
       FROM (your_UNION_query) AS q 
       WHERE q.id = p.id 
       AND q.colY = 'ACTIVE' 
      ) 
     ) 
+0

我通過將聯合查詢放在兩個FROM子句中來運行查詢,現在結果列表會縮小,但仍有用戶出現兩行,並顯示一行顯示已終止。也許我失蹤了? – Kevin

+0

@羅伯特:糟糕,我錯了。編輯答案。現在試試(它應該是'EXISTS',而不是'NOT EXISTS'。) –

+0

:你的解決方案是完美的。我有另一個問題,你可以看看我的後續文章:http://stackoverflow.com/questions/6794346/difference-between-using-load-data-and-through-phpmyadmin – Kevin

0

像這樣的事情會做的伎倆:

DELETE 
FROM tablename 
WHERE tablename.status = 'TERMINATED' 
    AND tablename.id IN(SELECT 
          id 
         FROM (SELECT 
           t.id 
           FROM tablename t 
           GROUP BY t.id 
           HAVING COUNT(t.id) > 1) AS T1) 

假設ID是場指的124,125等。