2013-04-26 15 views
0

我有一個簡單的查詢是這樣的:SQL Server的限制與地方但至少包括一次

SELECT subs.id_number, 
     op.dtupdated as dtopened 
FROM subscribers AS subs 
LEFT OUTER JOIN messages AS msg 
ON msg.id_number = subs.id_number 
LEFT JOIN email_opens AS op 
ON op.message_id = msg.message_id 
WHERE op.dtupdated > dateadd(month,-3,CURRENT_TIMESTAMP) 

基本上我試圖讓當電子郵件被打開(email_opens跟蹤表中的所有記錄),它通過id_number字段與用戶相關聯。我想在過去3個月內打開所有的電子郵件打開和關聯的id_number,但我也希望包含至少一次,在訂戶表中包含所有id號。

問題是我的where子句消除了過去3個月裏從來沒有任何公開郵件的所有記錄,但是我想包含一個帶有id_number和「NULL」的記錄,作爲未打開任何用戶的記錄。

我試過左外連接,工會(這工作,但後來我有重複),我只是不能似乎找出如何做到這一點。我確定必須有一個簡單的方法,我只是還沒有足夠的咖啡。

回答

0

WHERE子句中檢查op.dtupdated意味着將不匹配的記錄過濾掉。如果你這樣做,你的LEFT OUTER JOINON條款代替,你會得到subscribers每個記錄至少有一行:

SELECT subs.id_number 
    ,op.dtupdated AS dtopened 
FROM subscribers AS subs 
LEFT OUTER JOIN messages AS msg ON msg.id_number = subs.id_number 
LEFT OUTER JOIN email_opens AS op ON op.message_id = msg.message_id 
    AND op.dtupdated > dateadd(month, - 3, CURRENT_TIMESTAMP) 
+0

此查詢到永遠執行。如果我做一個簡單的查詢,如: '選擇 subs.id_number,op.dtupdated作爲dtopened 來自用戶的AS潛艇 LEFT OUTER JOIN 消息味精 ON msg.id_number = subs.id_number LEFT JOIN email_opens AS運算 ON op.message_id = msg.message_id WHERE op.dtupdated> DATEADD(月,-3,CURRENT_TIMESTAMP) UNION SELECT ID_NUMBER,NULL作爲dtopened FROM訂戶 ' 即只需要幾秒鐘的..問題是生病得到重複 – 2013-04-27 00:08:26