sql-server - 转换 WHERE 子句中的多个 'old format' 连接

标签 sql-server t-sql join database-migration

我在 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

最佳答案

希望您的查询能够转到以下结构。

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;

关于sql-server - 转换 WHERE 子句中的多个 'old format' 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32644506/

相关文章:

postgresql - 在带有 SELECT 语句的 INSERT INTO 语句中返回

mysql - SQL Join 语句在 where 子句上失败

mysql - 选择在一个日期存在但在另一个日期不存在的记录?

sql-server - 分区和最大值的慢查询性能问题

sql-server - 如何在 Microsoft SQL 中查找具有特定列名的主键的表?

sql - T-SQL 选择没有事件的帐户

sql - 在 SQL Server 中将月份名称转换为月份编号

sql-server - 无法使用 INSTEAD OF 触发器更新 View

sql-server - SQL跨多个表的唯一约束

sql - 这个查询怎么会违反主键呢?