【问题标题】:Converting a self subquery to a self join将自子查询转换为自联接
【发布时间】:2012-04-03 11:29:57
【问题描述】:

我想知道是否有办法将自子查询转换为自联接 这是自我子查询

SELECT a, 
       b 
FROM   c AS t1 
WHERE  ( b IN (SELECT b 
               FROM   c AS t2 
               WHERE  ( t1.b = b ) 
                      AND ( t1.e <> e )) ) 

【问题讨论】:

  • 你的子查询到底在做什么?看来你可以摆脱它......
  • 检查表中是否有相同的 b 值
  • 而e是用来区分事物的主键
  • SELECT a,b FROM c WHERE EXISTS(SELECT NULL FROM c c2 WHERE c2.b=c.b AND c2.e&lt;&gt;c.e) 可能会更快。

标签: sql sql-server-2008 join subquery


【解决方案1】:

由于e 是主键,另一种方法是

SELECT a, 
       b 
FROM   (SELECT a, 
               b, 
               COUNT(*) OVER (PARTITION BY b) AS Cnt 
        FROM   c) T1 
WHERE  Cnt > 1 

【讨论】:

    【解决方案2】:

    如果您只想查找重复项,EXIST 可能会更快:

    SELECT a,b FROM c WHERE EXISTS(SELECT NULL FROM c c2 WHERE c2.b=c.b AND c2.e<>c.e) 
    

    如果您想将每条记录与其重复项连接起来,但每条记录只获得一条:

    select  t1.a
    ,       t1.b
    ,       t1.e as t1e
    ,       t2.e as t2e
    from    c as t1
    inner join c as t2
    on      t1.b = t2.b 
            and t1.e > t2.e
    

    (请注意,我使用了&gt; 而不是&lt;&gt;

    【讨论】:

    • INEXISTS 可能会给出相同的计划。
    【解决方案3】:
    select  t1.a
    ,       t1.b
    from    c as t1
    join    c as t2
    on      t1.b = t2.b 
            and t1.e <> t2.e
    

    【讨论】:

      【解决方案4】:
      SELECT t1.a, t2.b
      FROM c as t1
      join c as t2 on t1.b=t2.b
      WHERE t1.e <> t2.e
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-16
        • 2018-07-19
        • 2014-12-26
        • 2020-12-06
        • 2010-10-10
        • 1970-01-01
        相关资源
        最近更新 更多