【问题标题】:Replace Subquery with a Join in SQL用 SQL 中的联接替换子查询
【发布时间】:2018-07-24 16:03:44
【问题描述】:

如何重写以下查询,使子查询成为联接的一部分?还是有其他更好的方法?

Declare @CR varchar(32)

SELECT count(*)
FROM [dbo].[TableC]
    INNER JOIN  [dbo].[TableCS] ON [TableCS].[CSI] = [TableC].[CSI]
    INNER JOIN [dbo].[TableI] ON [TableI].TableIId = [TableC].[TableIId]
WHERE [TableC].[CR] = @CR
    AND [TableI].[POR] = (SELECT POR FROM TableI inner join [TableC] on TableI.TableIId =  [TableC].TableIId and [TableC].CR = @CR)
    AND [TableCS].[Consider] = 1

【问题讨论】:

标签: sql tsql join


【解决方案1】:

如果 POR 是 TableC 的一列,那么...

Declare @CR varchar(32)

SELECT count(*)
        FROM [dbo].[TableC]
        INNER JOIN  [dbo].[TableCS] ON [TableCS].[CSI] = [TableC].[CSI]
        INNER JOIN [dbo].[TableI] ON [TableI].TableIId = [TableC].[TableIId] and [TableC].CR = @CR AND [TableI].[POR]= [TableC].POR
        WHERE [TableC].[CR] = @CR
        AND [TableCS].[Consider] = 1

【讨论】:

    【解决方案2】:

    您应该能够使用别名将子查询转换为您的主查询...

    SELECT
      COUNT(*) 
    FROM
      [dbo].[TableC]
    INNER JOIN 
      [dbo].[TableCS]
        ON [TableCS].[CSI] = [TableC].[CSI]
    INNER JOIN
      [dbo].[TableI]
        ON [TableI].TableIId = [TableC].[TableIId]
    (
        TableI   AliasedTableI
      INNER JOIN
        TableC   AliasedTableC
          ON  AliasedTableI.TableIId = AliasedTableC.TableIId
          AND AliasedTableC.CR       = @CR
    )
      ON  AliasedTableI.POR = TableI.POR
    WHERE
          [TableC].[CR] = @CR
      AND [TableCS].[ConsiderInExistenceChecks] = 1
    

    这不太可能是最好的和最终的重构。但在不了解您的架构或业务规则的情况下,这是我可以为您编写的唯一安全的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-08
      • 2013-07-29
      • 2022-01-20
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2015-02-27
      • 2010-10-10
      相关资源
      最近更新 更多