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
時有一種方法可以執行與查詢具有相同效果的單個查詢。也就是說,如果客戶有任何滿足排除條件的行,則不應該排除其行滿足排除條件(或者它們沒有排除條件)的情況下排除其行的所有。