【问题标题】:What would be the way to join these CTEs?加入这些 CTE 的方式是什么?
【发布时间】:2019-09-14 06:35:46
【问题描述】:

在处理以下 SQL 代码时,我似乎无法找到正确连接正在创建的 2 个 CTE 以获得正确(或至少是我预期的)记录数的方法。

TEST 1 & TEST 2 只返回每个 CTE 独立产生的记录; n & m

我希望能够使用 TEST 3(LEFT JOIN)或 TEST 4(INNER JOIN)检索 n 条记录,但无论如何我使用什么类型的连接(我已经尝试了所有的等值连接);我不断收到 m 条记录。


WITH
CTE_ALL_INSPECTIONS AS
(
    SELECT
            InspectorId,
            InspectionetailId
            ...
        FROM ...
        WHERE ...
),

CTE_ALL_INSPECTORS AS
(
    SELECT DISTINCT
            InspectorId,
            COUNT(InspectionDetailId) Inspections
        FROM CTE_ALL_INSPECTIONS
        GROUP BY InspectorId
)

/*
TEST 1:
*/
/*
    SELECT * FROM CTE_ALL_INSPECTORS
*/

/*
TEST 2:
*/
/*
    SELECT * FROM CTE_ALL_INSPECTIONS
*/

/*
TEST 3:
*/
/*
    SELECT
            CTE_ALL_INSPECTIONS.*,
            CTE_ALL_INSPECTORS.Inspections
        FROM
            CTE_ALL_INSPECTORS
            LEFT JOIN CTE_ALL_INSPECTIONS
                ON CTE_ALL_INSPECTIONS.InspectorId = CTE_ALL_INSPECTORS.InspectorId
*/

/*
TEST 4:
*/
/*
    SELECT
            CTE_ALL_INSPECTIONS.*,
            CTE_ALL_INSPECTORS.Inspections
        FROM
            CTE_ALL_INSPECTORS
            INNER JOIN CTE_ALL_INSPECTIONS
                ON CTE_ALL_INSPECTIONS.InspectorId = CTE_ALL_INSPECTORS.InspectorId
*/

我怎样才能得到我想要的记录?或者我还能如何加入这些表?

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    使用您的 TEST 3,但将 ...Inspections 设为您最左侧的查询:

    SELECT CTE_ALL_INSPECTIONS.*
        , CTE_ALL_INSPECTORS.Inspections 
    FROM CTE_ALL_INSPECTIONS
        LEFT JOIN CTE_ALL_INSPECTORS
            ON CTE_ALL_INSPECTIONS.InspectorId = CTE_ALL_INSPECTORS.InspectorId
    

    这就是说,“给我所有的检查,以及现有的检查员的任何计数”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 2018-08-28
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      相关资源
      最近更新 更多