将 Oracle 外连接转换为 SQL Server

Posted

技术标签:

【中文标题】将 Oracle 外连接转换为 SQL Server【英文标题】:Convert Oracle outer join to SQL Server 【发布时间】:2014-07-20 15:35:53 【问题描述】:

我无法将此 Oracle SQL 转换为 SQL 服务器。

这是查询:

    SELECT CM.ModuleID,
           CM.ModuleDescription,
           CM.ImageIndex,
            CASE
             WHEN CMAC.ClassID IS NULL THEN
              'N'
             ELSE
              'Y'
           END AS Checked
      FROM APP_MODULES         CM,
           APP_PROFILE         CMAP,
           APP_PROFILE_CLASS   CMAC
      WHERE 1 = 1
       AND CM.ParentModuleID IS NULL
       AND CMAP.ProfileID(+) = CMAC.ProfileID
       AND CM.ModuleID = CMAC.ModuleID(+)
       AND CMAC.ProfileID(+) = P_ProfileID
       AND CM.Activated = 'Y'
     ORDER BY CM.Ordem;

谁能帮帮我?

【问题讨论】:

欢迎来到 SO。请阅读How to Ask。首先,(+) 是旧的、特定于 oracle 的外连接语法。你肯定需要改变它。 除了@OldPrrogrammer 合理的建议之外,我不明白 WHERE 1 = 1 条件的必要性。 @rontornambe 这种情况通常是由于装配工造成的。您可以使用WHERE 1=1 <FILTERS> 编写查询,并使用AND Condition1 AND Condition2 AND ... 替换过滤器,条件数不限。这样,过滤器构建器可以非常简单(它不必生成实际的 where 子句)灵活(您可以有其他“硬编码” where 条件),并且通常不会影响性能,因为这样的条件大多被数据库忽略。 【参考方案1】:

这应该在 SQL Server 中工作:

SELECT CM.ModuleID,
       CM.ModuleDescription,
       CM.ImageIndex,
        CASE
         WHEN CMAC.ClassID IS NULL THEN
          'N'
         ELSE
          'Y'
       END AS Checked
  FROM APP_MODULES         CM,
       LEFT JOIN APP_PROFILE_CLASS CMAC 
            ON(CMAC.ProfileID = P_ProfileID AND CM.ModuleID = CMAC.ModuleID)
       LEFT JOIN APP_PROFILE CMAP
            ON(CMAP.ProfileID = CMAC.ProfileID)
  WHERE 1 = 1
   AND CM.ParentModuleID IS NULL
   AND CM.Activated = 'Y'
 ORDER BY CM.Ordem;

【讨论】:

以上是关于将 Oracle 外连接转换为 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

SQL 左外连接查询到 JPA 条件的转换

Oracle 左外连接的一些測试

SQL *= 语句(外连接)

从 Oracle 转换为 SQL Server

Oracle 中的连接表(多个外连接)

sql server 使用外连接结果转换成表格式