2013-12-23 34 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

相关问题