2016-05-24 32 views
0

我很熟悉使用SQL,你可以看到,我對使用2個表的迭代有疑問。2個表之間的迭代SQL查詢

這裏是東西:

我有兩個表 「UsersEmails」 和 「Sent_Emails」。

在「UsersEmail」中我有所有的電子郵件(用戶帳戶),在「Sent_Emails」中我有一段時間內發送的電子郵件,例如「今日」。

所以,我想知道哪些電子郵件帳戶在我的「UsersEmail」表發送今天和哪些werent。

我得到了一個想法,通過迭代我的表「UsersEmail」中的每封電子郵件,並在表「Email_Sent」上檢查它,但我不知道該怎麼做。

我希望你們能幫我解決這個問題。

我最好的問候。

+0

你可能想要的是一個'LEFT JOIN',但是你使用了哪些DBMS?即。 SQL Server,Oracle等。此外,'UsersEmail'和'Sent_Emails'之間的關係是什麼 - 是否有相關的id字段或簡單的電子郵件地址? –

+0

爲了記錄,「迭代」違背了SQL如何工作的核心原則。相反,認爲「套」......「我需要拿出一套......」或「我需要在一套......上操作」。思考迭代可能會成爲一個嚴重的限制和難以有效學習SQL的障礙(在那裏,這樣做......)。 – jleach

回答

0

你給的資料很少關於你的表但是據說你可以這樣寫:

發送今天:

select * from UsersEmail e 
where exists (select 1 from Sent_Emails where userEmailID=e.ID and 

TRUNC(emailDate)=TRUNC(sysdate)) 

未發送今天:

select * from UsersEmail e 
    where not exists (select 1 from Sent_Emails where userEmailID=e.ID and 

    TRUNC(emailDate)=TRUNC(sysdate)) 
+0

「存在子句」效率低得多,然後使用連接 – gh9

+0

廢話。要確定的唯一方法是檢查查詢計劃。通常查詢計劃是相同的。從歷史上看,「存在」通常更高效(如果只引用了聚集索引),但隨着查詢規劃者變得更加智能,這兩種方法通常是相同的。 –

0

發送的電子郵件今天

SELECT * FROM UserEmail as E 
INNER JOIN sentEmails AS s ON s.userEmailID = e.UserEmailId 
WHERE s.date = YOUR_TARGET_DATE 

今日未發送的電子郵件

SELECT * FROM UserEmail as E 
INNER JOIN sentEmails AS s ON s.userEmailID = e.UserEmailId 
WHERE s.date <> YOUR_TARGET_DATE 
+0

您的第二個SQL將返回昨天,上週和去年發送的所有內容,即使它今天也發送了。 – JBrooks

+0

@ jbrooks取決於他沒有給出的日期列。如果它是'2012-01-01'的日期,那麼它不會。根據OP的請求,OP只需要一個不會返回今天的事件的查詢。如果OP說日期列是日期時間,那麼我的查詢將需要更改,但沒有進一步的信息是不必要的 – gh9

0

您確實想跟蹤發送的郵件並且無法發送? 如果我是你,我會添加一列到我的餐桌「Sent_Emails」日期時間,並設定發送日期時,我的郵箱是由用戶, 在這種情況下發送,

--MAILS SENT: SELECT * FROM SEND_MAILS WITH(NOLOCK)INNER JOIN USEREMAILS WITH(NOLOCK)ON = SEND_MAILS.USERMAILID USEREMAILS.USERMAILID WHERE SEND_MAILS.SENDDATE IS NOT NULL

--MAILS NOT - SENT:SELECT * FROM SEND_MAILS WITH(NOLOCK) INNER JOIN USEREMAILS WITH(NOLOCK)ON SEND_MAILS.USERMAILID = USEREMAILS.USERMAILID WHERE SEND_MAILS.SENDDATE IS NULL

有了這個信息,你可以報告每天發送的郵件。 像

SELECT * FROM SEND_MAILS WITH(NOLOCK)INNER JOIN USEREMAILS WITH (NOLOCK)ON = SEND_MAILS.USERMAILID WHERE USEREMAILS.USERMAILID SEND_MAILS.SENDDATE = '2016年5月24日'

0

我喜歡用英語將問題重複給自己,然後編寫SQL。您想比較給定userEmailID發送的最後一封電子郵件到今天的開始日期。以下子查詢爲您提供給定的userEmailID發送的最後一封電子郵件。案件陳述將爲今天發送1,0表示未發送或最近發送的電子郵件比今天早。

SELECT E.*, 
CASE WHEN MaxSentEmail > trunc_date(getdate()) THEN 1 ELSE 0 END AS SentToday 
FROM UserEmail as E 
LEFT JOIN (SELECT se.userEmailID, 
    max(se.sentEmails) AS MaxSentEmail 
    FROM sentEmails se 
    GROUP BY se.userEmailID) as se 
on E.UserEmailID = se.userEmailID 
ORDER BY E.UserEmailID