【问题标题】: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 子句中的连接还是选择

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

【问题讨论】:

标签: sql-server


【解决方案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)
        

        【讨论】:

          猜你喜欢
          • 2017-05-27
          • 2019-11-15
          • 2019-12-14
          • 2022-01-18
          • 2017-01-28
          • 1970-01-01
          • 1970-01-01
          • 2015-03-05
          相关资源
          最近更新 更多