2什么SQL表之间的一种连接,他们没有共同的ID?(What kind of join betwee

2019-11-02 18:38发布

我有一个SQL表由ID,姓名,电子邮件,......我有一个具有ID,电子邮件,emailstatus但这些2号是不同的,他们是不相关的另一个SQL表。 这间2个表是电子邮件,是唯一的共同点。

我想加入这两个表带来的一切信息,从表1,如果电子邮件地址从表1和表2是相同的,emailstatus是“退回”。 但是,我写的查询让我比预期更多的记录。

你能帮我吗? 此外,我什至不知道这是一个没有共同的ID做正确的事。 这是我的查询。

 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 

Answer 1:

它看起来像你的根的问题是:

“找出在申请人的每个记录是否曾经有一个反弹的电子邮件。”

下面的查询应该给你你想要的输出(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字段往往是主键或主键的一部分)。 我不会太担心这个,除非你发现它引起的问题。 对电子邮件引入指数两个表将有助于如果它原来是一个问题。
  • 使用LEFT OUTER JOIN与B.emailstatus =“反弹”确保只有在emailstatus的反弹行包括在JOIN(意为即使john@test.com有一个电子邮件的状态,他仍然显示在结果集中的空,因为他的状态不是“反弹”)。
  • SQL小提琴(下面的链接)是通过互联网进行通信的SQL问题的人的一个很好的方式。
  • 使用DISTINCT去除相同的行。 这将阻止你获得多个相同的记录作为多的结果tbl_webhook退回的电子邮件记录。

SQL小提琴架构:

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')


Answer 2:

移动H.[EmailStatus] = 'bounced' OR H.[EmailStatus] IS NULL WHERE子句。 这应该给你想要的结果。
OUTER JOIN我们携手条件是不一样的过滤条件WHERE子句

编辑:更新了条件,使无状态的行被拉入结果集。



文章来源: What kind of join between 2 SQL table that they don't have common id?