【问题标题】:Converting Multiple 'old format' Joins in WHERE Clause在 WHERE 子句中转换多个“旧格式”连接
【发布时间】:2015-12-15 03:49:48
【问题描述】:

我在 SQL Server 中有以下代码结构。它在 WHERE 子句中使用多个旧格式 *= 连接?

SELECT ....
FROM (select ...) L1,
     (select ...) L2,
     (select ...) SE,
     (select ...) EX,
     (select ...) SE,
     (select ...) Y1,
     (select ...) Y2,
     (select ...) Y3,
     (select ...) Y4,
     (select ...) Y5
WHERE SE.FV = EX.FV
    and SE.FV *= Y1.FV
    and SE.FV *= Y2.FV
    and SE.FV *= Y3.FV
    and SE.FV *= Y4.FV
    and SE.FV *= Y5.FV
    and SE.L1 *= L1.FV
    and SE.L2 *= L2.FV
GROUP BY L1.FV, L1.Descr, L2.FV, L2.Descr
ORDER BY L1.FV, L1.Descr, L2.FV, L2.Descr

在实际代码中,选择是动态生成的 sql 的混搭之母。但本质上,结构如我上面所示。

上述模板的结构应该是什么,以便它使用正确的 LEFT OUTER JOIN 语法,而不改变查询的逻辑?

这样的东西可能有用吗?

SELECT L1.FV, L1.Descr, L2.FV, L2.Descr, Y1.B, Y1.A, Y2.B, Y2.A, ...
FROM (select ...) SE
     LEFT OUTER JOIN (select ...) Y1 ON SE.FV = Y1.FV
        AND LEFT OUTER JOIN (select ...) Y2 ON SE.FV = Y2.FV
        AND LEFT OUTER JOIN (select ...) Y3 ON SE.FV = Y3.FV
        AND LEFT OUTER JOIN (select ...) Y4 ON SE.FV = Y4.FV
        AND LEFT OUTER JOIN (select ...) Y5 ON SE.FV = Y5.FV
        AND LEFT OUTER JOIN (select ...) L1 ON SE.L1 = L1.FV
        AND LEFT OUTER JOIN (select ...) L2 ON SE.L2 = L2.FV,
     (select ...) EX
WHERE SE.FV = EX.FV
GROUP BY L1.FV, L1.Descr, L2.FV, L2.Descr
ORDER BY L1.FV, L1.Descr, L2.FV, L2.Descr

【问题讨论】:

  • 您已经指定了 GROUP BY 列 L1.FV、L1.Descr、L2.FV、L2.Descr。编写 SELECT 时,除 GRROUP BY 之外的任何其他列都应与函数一起应用。例如:MAX(Y1.B)。除此之外,您的查询应该可以工作。

标签: sql-server tsql join database-migration


【解决方案1】:

我希望,您的查询可以带入以下结构。

SELECT      L1.FV, 
            L1.Descr, 
            L2.FV, 
            L2.Descr,
            .. 
FROM                (select ...) L1
JOIN/LEFT JOIN      (select ...) L2 ON L2.Col = ....
JOIN/LEFT JOIN      (select ...) SE ON SE.Col = ....
JOIN/LEFT JOIN      (select ...) EX ON EX.Col = ....
JOIN/LEFT JOIN      (select ...) SE ON SE.Col = ....
JOIN/LEFT JOIN      (select ...) Y1 ON Y1.Col = ....
JOIN/LEFT JOIN      (select ...) Y2 ON Y2.Col = ....
JOIN/LEFT JOIN      (select ...) Y3 ON Y3.Col = ....
JOIN/LEFT JOIN      (select ...) Y4 ON Y4.Col = ....
JOIN/LEFT JOIN      (select ...) Y5 ON Y5.Col = ....
GROUP BY L1.FV, L1.Descr, L2.FV, L2.Descr
ORDER BY L1.FV, L1.Descr, L2.FV, L2.Descr;

【讨论】:

    【解决方案2】:

    您可能希望通过使用这样的 CTE 将“动态生成的 sql 的混搭”与 STRUCTURE 分开:

    WITH 
        SE AS (select 1 AS X, 2 AS FV, 3 AS L1, 4 AS L2),
        EX AS (select 1 AS X, 2 AS FV),
        Y1 AS (select 1 AS X, 2 AS FV),
        Y2 AS (select 1 AS X, 2 AS FV),
        Y3 AS (select 1 AS X, 2 AS FV),
        Y4 AS (select 1 AS X, 2 AS FV),
        Y5 AS (select 1 AS X, 2 AS FV),
        L1 AS (select 1 AS X, 3 AS FV, 'y' AS Descr),
        L2 AS (select 1 AS X, 4 AS FV, 'z' AS Descr)
    SELECT L1.FV, L1.Descr, L2.FV, L2.Descr
    FROM 
         SE
         INNER JOIN EX ON EX.FV = SE.FV
         LEFT JOIN Y1 ON Y1.FV = SE.FV
         LEFT JOIN Y2 ON Y2.FV = SE.FV
         LEFT JOIN Y3 ON Y3.FV = SE.FV
         LEFT JOIN Y4 ON Y4.FV = SE.FV
         LEFT JOIN Y5 ON Y5.FV = SE.FV
         LEFT JOIN L1 ON L1.FV = SE.L1
         LEFT JOIN L2 ON L2.FV = SE.L2
    GROUP BY L1.FV, L1.Descr, L2.FV, L2.Descr
    ORDER BY L1.FV, L1.Descr, L2.FV, L2.Descr
    

    【讨论】:

    • 不同连接之间的“AND”语法不正确。每个 JOIN 都是一个独立的子句;您提供的“AND”将在语法上附加到“ON”表达式的末尾,从而产生语法错误。
    • 我不明白您为什么要分离 EX 表,将其放在 WHERE 子句而不是 INNER JOIN 子句中。它会起作用,但我认为没有必要。
    • 感谢您的提示。这是相当多的代码更改(+200 行),但您的解决方案似乎非常优雅。所以我试一试。我更像是分析师而不是开发人员,所以我的 SQL 非常生疏!! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多