SQL 连接两列,其中 1 相等,另一列不相等

发布于 2024-12-27 14:00:43 字数 1500 浏览 2 评论 0原文

如何在两列上连接 2 个不同的表,其中一列相等而另一列不相等。在下面的示例中,我需要查询电子邮件匹配但 NID 不匹配的记录。

Table A
ID              NID                  Email
1               bob                  [email protected]
2               mike                 [email protected]
3               dave                 [email protected]

Table B
ID              NID                  Email
1               bob                  [email protected]
2               mike                 [email protected]
3               doug                 [email protected]

示例输出应来自表 B:

ID              NID                  Email

3               doug                 [email protected]

如果您可以在 LINQ to Entities 中执行此操作,则可获得加分

How can I join 2 different tables on 2 columns where one column is equal and the other is not. In the example below, I need to query for records where the email matches but the NID does not.

Table A
ID              NID                  Email
1               bob                  [email protected]
2               mike                 [email protected]
3               dave                 [email protected]

Table B
ID              NID                  Email
1               bob                  [email protected]
2               mike                 [email protected]
3               doug                 [email protected]

Sample output should be from Table B:

ID              NID                  Email

3               doug                 [email protected]

Bonus points if you can do it in LINQ to Entities

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

伊面 2025-01-03 14:00:43
SELECT *
FROM TableA JOIN TableB ON TableA.Email = TableB.Email
WHERE TableA.NID <> TableB.NID
SELECT *
FROM TableA JOIN TableB ON TableA.Email = TableB.Email
WHERE TableA.NID <> TableB.NID
杯别 2025-01-03 14:00:43
CREATE TABLE #TableA
(
    ID int,
    NID varchar(25),
    Email varchar(50)
)

CREATE TABLE #TableB
(
    ID int,
    NID varchar(25),
    Email varchar(50)
)

INSERT INTO #TableA(ID, NID, Email) VALUES (1, 'bob', '[email protected]')
INSERT INTO #TableA(ID, NID, Email) VALUES (2, 'mike', '[email protected]')
INSERT INTO #TableA(ID, NID, Email) VALUES (3, 'dave', '[email protected]')

INSERT INTO #TableB(ID, NID, Email) VALUES (1, 'bob', '[email protected]')
INSERT INTO #TableB(ID, NID, Email) VALUES (2, 'mike', '[email protected]')
INSERT INTO #TableB(ID, NID, Email) VALUES (3, 'doug', '[email protected]')

SELECT 
    #TableB.ID, 
    #TableB.NID, 
    #TableB.Email
FROM 
    #TableB Inner Join #TableA
    ON #TableA.ID = #TableB.ID WHERE #TableA.NID <> #TableB.NID

DROP TABLE #TableA
DROP TABLE #TableB

结果:

3 doug [电子邮件受保护]


In conclusion just a join with a WHERE condition

SELECT 
    TableB.ID, 
        TableB.NID, 
        TableB.Email
FROM 
        TableB 
Inner Join 
        TableA
ON TableA.ID = TableB.ID WHERE TableA.NID <> TableB.NID
CREATE TABLE #TableA
(
    ID int,
    NID varchar(25),
    Email varchar(50)
)

CREATE TABLE #TableB
(
    ID int,
    NID varchar(25),
    Email varchar(50)
)

INSERT INTO #TableA(ID, NID, Email) VALUES (1, 'bob', '[email protected]')
INSERT INTO #TableA(ID, NID, Email) VALUES (2, 'mike', '[email protected]')
INSERT INTO #TableA(ID, NID, Email) VALUES (3, 'dave', '[email protected]')

INSERT INTO #TableB(ID, NID, Email) VALUES (1, 'bob', '[email protected]')
INSERT INTO #TableB(ID, NID, Email) VALUES (2, 'mike', '[email protected]')
INSERT INTO #TableB(ID, NID, Email) VALUES (3, 'doug', '[email protected]')

SELECT 
    #TableB.ID, 
    #TableB.NID, 
    #TableB.Email
FROM 
    #TableB Inner Join #TableA
    ON #TableA.ID = #TableB.ID WHERE #TableA.NID <> #TableB.NID

DROP TABLE #TableA
DROP TABLE #TableB

Result:

3 doug [email protected]


In conclusion just a join with a WHERE condition

SELECT 
    TableB.ID, 
        TableB.NID, 
        TableB.Email
FROM 
        TableB 
Inner Join 
        TableA
ON TableA.ID = TableB.ID WHERE TableA.NID <> TableB.NID
你是年少的欢喜 2025-01-03 14:00:43

这应该可行:

SELECT A.*, B.*
FROM TableA A FULL OUTER JOIN
     TableB B ON A.Email = B.Email
             AND A.NID <> B.NID
;

不清楚您是否只需要 A 记录,只需要 B 记录,还是两者都需要。您可以根据您期望返回的数据更改 SELECTJOIN 类型。

这解决了您所描述的问题,但是如果您对包含示例数据的表运行它,您将得到一个空结果集。

This should work:

SELECT A.*, B.*
FROM TableA A FULL OUTER JOIN
     TableB B ON A.Email = B.Email
             AND A.NID <> B.NID
;

It's not clear if you want only the A records, only the B records, or both. You'd change the SELECT and JOIN type depending on which data you're expecting back.

This solves the question as you described it, but if you run it against tables containing your sample data you're going to get an empty result set.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文