我应该使用啥类型的连接?
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)
【讨论】:
以上是关于我应该使用啥类型的连接?的主要内容,如果未能解决你的问题,请参考以下文章