两个SQL表之间有什么样的连接,它们没有共同的id?

时间:2013-12-23 22:04:33

标签: sql sql-server join

我有一个SQL表,包括id,name,email,....我有另一个有id,email,emailstatus的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     test2@yahoo.com           lili      test2@yahoo.com        bounced
 2     tesere@yahoo.com          mike             Null                Null
 3     tedfd2@yahoo.com          nik           tedfd2@yahoo.com       bounced
 4     tdfdft2@yahoo.com         sam               Null              Null              
 5     tedft2@yahoo.com          james     tedft2@yahoo.com       bounced
 6     tedft2@yahoo.com          San              Null 

2 个答案:

答案 0 :(得分:2)

H.[EmailStatus] = 'bounced' OR H.[EmailStatus] IS NULL移动到WHERE子句。这应该会给你想要的结果 在OUTER JOIN中,连接条件与WHERE子句中的过滤条件

不同

编辑:更新了条件,以便没有状态的行被拉入结果集。

答案 1 :(得分: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被退回的行(即使john@test.com具有电子邮件状态,他仍然显示为NULL结果集,因为他的状态没有“反弹”。)
  • SQL Fiddle(下面的链接)是一种通过互联网向人们传达SQL问题的绝佳方式。
  • 使用DISTINCT删除相同的行。由于tbl_webhook中的多个退回电子邮件记录,这将阻止您获取多个相同的记录。

SQL Fiddle架构:

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

INSERT INTO Applicant VALUES(1, 'John', 'john@test.com')
INSERT INTO Applicant VALUES(2, 'Bob', 'bob@test.com')
INSERT INTO Applicant VALUES(3, 'Mary', 'mary@test.com')
INSERT INTO Applicant VALUES(4, 'Jane', 'jane@test.com')

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

INSERT INTO tbl_Webhook VALUES('AA', 'john@test.com', 'received')
INSERT INTO tbl_Webhook VALUES('BB', 'bob@test.com', 'bounced')
INSERT INTO tbl_Webhook VALUES('CC', 'mary@test.com', 'sent')