【问题标题】:Change Sql "Not In" To "Left Outer Join"将 Sql 的“Not In”更改为“Left Outer Join”
【发布时间】:2011-01-02 04:31:18
【问题描述】:

我不想使用“不在”这个 sql 查询。我该怎么做?谢谢

SELECT  
 T2.Sno,
 T2.Name,
 T1.description,
 T2.UserCode            
FROM 
 Table1 AS T1 (nolock)
    INNER JOIN T2 (nolock)
    ON T1.UserCode = T2.UserCode
WHERE
 g.xid= @p_xid
 and T2.Sno not in (select Gid from T3 (nolock))

【问题讨论】:

  • 虽然NOT IN 在设计上通常是一个危险信号,但大多数时候将其更改为LEFT JOIN-IS NULL/NOT EXISTS 实际上更糟糕。确保检查您的执行计划并确保这确实是您想要的。

标签: sql-server tsql join


【解决方案1】:

假设在 T2 中没有 Sno 为空的行和在 T3 中 Gid 为空的行:

SELECT  
 T2.Sno,
 T2.Name,
 T1.description,
 T2.UserCode            
FROM 
 Table1 AS T1 WITH (nolock)
    INNER JOIN T2 WITH (nolock)
      LEFT JOIN T3 WITH (NOLOCK)
      ON T2.Sno = T3.Gid
    ON T1.UserCode = T2.UserCode
WHERE
 g.xid= @p_xid
 and T3.Gid IS NULL

【讨论】:

    【解决方案2】:

    如果每个 T2.Sno = T3.Gid 有多个 T3 行,则在 JOIN 中需要 DISTINCT。

    • 没有 DISTINCT,这是一个不同的查询
    • 使用 DISTINCT,这是一个额外的步骤。

    我会使用 NOT EXISTS 来避免这种情况。

    SELECT  
     T2.Sno,
     T2.Name,
     T1.description,
     T2.UserCode            
    
    FROM 
     Table1 AS T1 (nolock)
        INNER JOIN T2 (nolock)
        ON T1.UserCode = T2.UserCode
    WHERE
     g.xid= @p_xid
     and not exists (select * from T3 (nolock) where T3.Gid = T2.Sno)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多