我应该使用什么类型的联接?

时间:2014-02-11 23:56:07

标签: sql-server

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

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

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

我完全不知道如何展示它,无论是在where子句中的连接还是选择

谢谢,道歉我知道很多像这样的东西都出现在以太中

4 个答案:

答案 0 :(得分:2)

而不是JOIN,我认为你想要除外。

SELECT * FROM table1
EXCEPT
SELECT * FROM table2

当然,只适用于列相同,或者如果您可以指定列的常用列表而不是*。

答案 1 :(得分:1)

您应该使用 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关键字。

答案 2 :(得分:0)

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

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

或者'null join'方法

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

答案 3 :(得分:0)

我认为你混淆了两个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)