【问题标题】:SQL Select When Something IS NOT IN a Joined Table连接表中没有内容时的 SQL 选择
【发布时间】:2013-03-15 11:28:50
【问题描述】:

好的。我在一个表中有一些数据,在多个场合引用了另一个表中的一些数据。

Table1 - 主客户表 表 2 - 用户定义字段

假设我有一个查询,显示来自 Table1 的客户端 ID 以及来自 Table2 的所有附加/使用的“使用定义字段”

SELECT t1.Id, t2.udf
FROM Table1 t1
JOIN Table2 t2 ON t1.Id = t2.Index
WHERE t1.EndDate IS NULL AND
      t1.Id = '1234.9876' AND

我会得到以下结果...

ID            UDF
1234.9876     100
1234.9876     110
1234.9876     118
1234.9876     124
1234.9876     198
1234.9876     256

现在,假设我想查询同样的内容,并且只获取客户端的 ID,但前提是不存在等于 '194' 的 t2.udf 值。所以,我会简单地得到

ID           
1234.9876    

...结果。

【问题讨论】:

    标签: sql-server-2008 tsql join left-join outer-join


    【解决方案1】:

    使联接成为 t2.Index 为空的左联接和文件管理器

    SELECT t1.Id
    FROM Table1 t1
    LEFT JOIN Table2 t2 ON t1.Id = t2.Index
    AND t2.UDF = 194   -- has to be before where clause
    WHERE t2.Index IS NULL
    AND t1.EndDate IS NULL 
    AND t1.Id = '1234.9876'  -- not sure if you want this part
    

    使用 NOT EXISTS 的另一种方式

    SELECT t1.Id
    FROM Table1 t1
    WHERE NOT EXISTS (SELECT 1 FROM  Table2 t2 WHERE t1.Id = t2.INDEX
                    AND t2.UDF = 194)
    AND t1.EndDate IS NULL 
    AND t1.Id = '1234.9876'  
    

    另见JOINS

    【讨论】:

    • +1 NOT EXISTS is by far the best 在几乎所有情况下。
    • @AaronBertrand 如果 Table2 在连接列上与 Table1 具有 FK 关系,并且该列是 Table2 上复合 PK 的一部分,那么左连接是否会命中?
    • 这正是我所需要的。我以前使用过 LEFT JOIN,但从未以这种方式使用过。你每天都能学到新东西,对吧?非常非常感谢你。你是一个救生员。
    【解决方案2】:

    您可以添加 AND t2.udf not in (select udf from table2 where udf '194')。 但是@SQLMenace 解决方案更好

    【讨论】:

      【解决方案3】:

      应该这样做。

      SELECT DISTINCT t1.Id 
      FROM Table1 t1
      LEFT JOIN Table2 t2 ON t1.Id = t2.Index
      WHERE t2.UDF NOT IN (194)
      AND t2.Index IS NULL
      

      Select DISTINCT 为您提供满足其他条件的唯一条目,以及第一个 where 子句

        t2.UDF NOT IN (194)
      

      Normall 将返回 t2.UDF 不是 194 的 t1 的所有行,但受 Select Distinct 限制,只能为您提供不同的 id

      【讨论】:

        【解决方案4】:

        尝试以下方法:

        SELECT t1.Id
        FROM Table1 t1
        JOIN Table2 t2 ON t1.Id = t2.Index
        WHERE t1.EndDate IS NULL AND
              t1.Id = '1234.9876' AND
              t2.udf <> '194'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多