2013-12-23 39 views
0

我有一個SQL表由ID,名稱,電子郵件,....我有另一個SQL表,有ID,電子郵件,emailstatus但這兩個ID是不同的,他們是不相關的。這兩張桌子唯一常見的就是電子郵件。2 SQL表之間它們沒有共同的id是什麼樣的連接?

我想加入這兩個表,將table1中的所有信息加入,如果表1和表2中的電子郵件地址相同,並且emailstatus是'Bounced'。但是我寫的查詢給我的記錄比預期的要多。

你能幫忙嗎?此外,我甚至不確定沒有共同的身份證是沒有問題的。這是我的查詢。

SELECT 
A.[Id] 
,A.[Application] 
,A.[Loan] 
,A.[Firstname] 
,A.[Lastname] 
,A.[Email], 
,H.[Email], H.[EmailStatus] as BouncedEmail 
FROM Applicant A (NOLOCK) 

left outer join [tbl_Webhook] [H] (NOLOCK) 
on A.Email = H.Email 

and A.Email is not Null and H.Email is not Null and H.[EmailStatus]='bounced' 

樣品所期望的數據:

id email     name    emailFromTable2  emailstatus 
1  [email protected]   lili  [email protected]  bounced 
2  [email protected]   mike    Null    Null 
3  [email protected]   nik   [email protected]  bounced 
4  [email protected]   sam    Null    Null    
5  [email protected]   james  [email protected]  bounced 
6  [email protected]   San    Null 
+2

好像內加入應該足夠了(常見的電子郵件是常見的ID一樣好,如果我們忽視的性能問題),這裏不需要null檢查。 –

+0

這是使用SQL Server語法,因此我附加了該標籤。 –

+0

您可以提供樣本數據和期望的結果嗎?我無法弄清楚你的意思,「我想加入這兩個表,把table1的所有信息加入,如果表1和表2的電子郵件地址相同,emailstatus是'Bounced'」。 –

回答

0

它看起來像你的根的問題是:

「找出在申請人的每個記錄是否曾經有一個反彈的電子郵件。」

以下查詢應該爲您提供所需的輸出(當不反彈時爲NULL值,否則爲'反彈')。

SELECT A.id, A.name, A.email, B.emailstatus 
FROM Applicant A 
LEFT OUTER JOIN 
(
    SELECT DISTINCT email, emailstatus 
    FROM tbl_webhook 
) B 
ON A.email = B.email 
AND B.emailstatus = 'bounced' 

一些注意事項:

  • 入世對非id字段是罰款。唯一可能需要考慮的是性能(因爲id字段往往是主鍵或主鍵的一部分)。除非您注意到它導致問題,否則我不會擔心太多。如果事實證明這是一個問題,在兩張表上引入電子郵件索引將會有所幫助。
  • 使用帶有B.emailstatus ='bounced'的LEFT OUTER JOIN確保只有emailstatus被退回的行包含在連接中(即使[email protected]具有電子郵件狀態,他仍然顯示爲NULL結果集,因爲他的狀態不是'反彈')。
  • SQL小提琴(下面的鏈接)是通過互聯網向人們傳達SQL問題的絕妙方式。
  • 使用DISTINCT刪除相同的行。這將阻止您獲取多個相同的記錄,作爲tbl_webhook中多次彈回的電子郵件記錄的結果。

SQL Fiddle模式:

CREATE TABLE Applicant (id int, name varchar(10), email varchar(100)) 

INSERT INTO Applicant VALUES(1, 'John', '[email protected]') 
INSERT INTO Applicant VALUES(2, 'Bob', '[email protected]') 
INSERT INTO Applicant VALUES(3, 'Mary', '[email protected]') 
INSERT INTO Applicant VALUES(4, 'Jane', '[email protected]') 

CREATE TABLE tbl_Webhook (id varchar(2), email varchar(100), emailstatus varchar(10)) 

INSERT INTO tbl_Webhook VALUES('AA', '[email protected]', 'received') 
INSERT INTO tbl_Webhook VALUES('BB', '[email protected]', 'bounced') 
INSERT INTO tbl_Webhook VALUES('CC', '[email protected]', 'sent') 
+0

@託德感謝您的迴應我也正是嘗試這一點,但我再次獲得更多的記錄,在加入之前,我有209694記錄和我得到了532319.如何獲得相同的記錄數,意味着如果數據存在於表1中表2中有數據顯示數據,否則我不需要顯示table2數據。 – nikta

+0

如果您在LEFT OUTER JOIN之後接收到更多記錄,那麼這意味着'Applicant'中的每行'tbl_webhook'必須有多行(這是有道理的)。你想回答什麼問題?你是問一個申請人是否曾經收到郵件反彈,或者他們有多少次反彈? –

+0

@託德只有重要的是有任何反彈的電子郵件,所以一次是好的,因爲我只需要找到有限的電子郵件地址。 – nikta

2

移動的H.[EmailStatus] = 'bounced' OR H.[EmailStatus] IS NULL WHERE子句。這應該會給你想要的結果。
OUTER JOIN我們攜手條件是不一樣的WHERE條款

編輯的過濾條件:更新了條件,使無狀態行被拉入結果集。

+0

我以前試過,那麼它只給我列在第二個表中有email和emailstatus的列,它不會返回第一個表中沒有第二個表中沒有記錄的任何數據。 – nikta

+1

@nikta戈登建議請提供一些示例數據以獲得更多幫助。 – user2989408

+0

我編輯了問題,並把樣本數據。 – nikta

相關問題