我应该使用啥类型的连接?

Posted

技术标签:

【中文标题】我应该使用啥类型的连接?【英文标题】:What type of join should i be using?我应该使用什么类型的连接? 【发布时间】:2014-02-11 23:56:06 【问题描述】:

我在 sql server 中有 2 个表 ...

表 1 包含 100,000 个帐户名称和帐户 ID 表 2 包含表 1 中已包含的 10,000 个帐户名称和帐户 ID

我需要显示表 1 中没有出现在表 2 中的所有记录(这样应该会给我 90,000 个结果。

我完全不知道如何显示这一点,无论是 where 子句中的连接还是选择

谢谢,很抱歉,我知道很多这样的事情都在外面

【问题讨论】:

How can I join two tables but only return rows that don't match? 的可能副本。接受的答案看起来是一个很好的“通用 sql”解决方案。 【参考方案1】:

我认为您想要 EXCEPT,而不是 JOIN。

SELECT * FROM table1
EXCEPT
SELECT * FROM table2

当然,那只适用于列是相同的,或者如果你可以指定一个通用的列列表而不是*。

【讨论】:

【参考方案2】:

您应该使用 LEFT OUTER JOIN

像这样。

SELECT T1.*
FROM Table1 T1 LEFT OUTER JOIN Table2 T2
   ON T1.AccountID = T2.AccountID
WHERE T2.AccountID IS NULL

解释:这将从Table1 中获取所有行,并尝试将它们与Table2 中的所有行链接。在匹配的地方,Table2.AccountId 将具有匹配的AccountID。如果没有匹配,Table2.AccountId 将是 NULL

另一种方法是不使用 JOIN,即使用 EXISTS 关键字。

【讨论】:

【参考方案3】:

我不确定确切的 sql-server 语法,但在其他数据库中你可以这样做

select * from table1 t1 where t1.id not in (select id from table2)

或者“空连接”方法

select * from table1 t1 left join table2 t2 on t1.id = t2.id where t2.id is null

【讨论】:

【参考方案4】:

我认为您混淆了 2 个 SQL 概念:

Join 通常用于将通过某个键链接的两个表连接在一起:例如,您可能有一个包含用户名和密码的登录表,其中包含 USERID 字段。在另一个表中,您有关于同样具有 USERID 字段的同一用户的地址信息。您只需执行SELECT ... FROM passwords p join address a on p.userid = a.userid。这将为您提供所有用户密码和相关的用户数据。

在你的情况下,你不需要组合,你只想使用 NOT IN

SELECT * FROM TABLE 1 WHERE somevalue not in (SELECT somevalue from table2)

【讨论】:

以上是关于我应该使用啥类型的连接?的主要内容,如果未能解决你的问题,请参考以下文章

PHP Mysqli'动态地'说应该使用啥连接(变量)

我应该在啥时候使用 Android 的不同消息类型?

我应该使用啥将 Rails 应用程序与远程服务器连接?

我应该使用啥类型的稀疏向量?

金钱应该使用啥数据类型

我应该使用啥类型的企业架构师 API 创建组件实例?