2013-02-01 46 views
1

我會用模式開始:通過外連接排除所有可能的行嗎?

CREATE TABLE CustomersActions (
    `caID` int(10) unsigned NOT NULL AUTO_INCREMENT primary key, 
    `cusID` int(11) unsigned NOT NULL, 
    `caTimestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
) 
CREATE TABLE `Assignments` (
    `asgID` int(10) unsigned NOT NULL AUTO_INCREMENT primary key, 
    `cusID` int(11) unsigned NOT NULL, 
    `asgAssigned` date DEFAULT NULL, 
    `astID` int(10) unsigned NOT NULL 
) 
CREATE TABLE `AssignmentStatuses` (
    `astID` int(10) unsigned NOT NULL AUTO_INCREMENT primary key, 
    `astStatus` varchar(255) DEFAULT '' 
) 

我原來的查詢是:

SELECT DISTINCT 
    ca.cusID 
    FROM 
    CustomersActions ca 
    WHERE  
    NOT EXISTS (
     SELECT 
      TRUE 
     FROM 
      Assignments asg 
      NATURAL JOIN AssignmentStatuses 
     WHERE 
      asg.cusID = ca.cusID 
      AND (
       DATE_ADD(asgAssigned, INTERVAL 6 DAY) > NOW() 
       OR astStatus IN('Not contacted', 'Follow-up') 
      ) 
    ) 

如果說客戶不具有行Assignments這樣做是選擇從CustomersActions所有cusID項即「未聯繫」或「後續」(對於任何日期範圍),或者從不到六天前的任何狀態轉讓。

我試着寫使用LEFT JOIN相同的查詢從Assignments排除像這樣:

SELECT DISTINCT 
    ca.cusID 
FROM 
    CustomersActions ca 
    LEFT JOIN (
     Assignments asg 
     NATURAL JOIN AssignmentStatuses 
    ) ON (ca.cusID = asg.cusID) 
WHERE 
    asgID IS NULL 
    OR DATE_ADD(asgAssigned, INTERVAL 6 DAY) < NOW() 
    OR astStatus IN('Not contacted', 'Follow-up') 

的問題是,有可能爲一個客戶有多個條目Assignments所以cusID可以選擇,即使他們有一個現有的行應該強制排除它們。這對我有意義,並且NOT EXISTS解決了這個問題。

我想知道的是,如果在使用NOT EXISTS時有一種方法可以執行與查詢具有相同效果的單個查詢。也就是說,如果客戶有任何滿足排除條件的行,則不應該排除其行滿足排除條件(或者它們沒有排除條件)的情況下排除其行的所有

回答

0

您是否嘗試過使用NOT IN條款,如:

SELECT DISTINCT 
    ca.cusID 
FROM 
CustomersActions ca 
WHERE cusID  
NOT IN (
    SELECT 
     cusID 
    FROM 
     Assignments asg 
     INNER JOIN AssignmentStatuses ast 
     ON asg.astID = ast.astID 
     WHERE 
      DATE_ADD(asgAssigned, INTERVAL 6 DAY) > NOW() 
      OR astStatus IN('Not contacted', 'Follow-up') 
) 
相關問題