我有一个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
答案 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'
一些注释:
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')