首页 > 解决方案 > Oracle 到 T-SQL CTE 转换错误

问题描述

将 Oracle 语法转换为 T-SQL 时遇到问题。尝试转换以下语句:

SELECT *
FROM (WITH NEW_USERS AS (SELECT WPP.USER_ID
                         FROM DSS_ERS_STAGE.ES_W_PARTICIPANT_DIM WPP
                       MINUS
                       SELECT PP.USER_ID FROM DSS_ERS_STAGE.ES_PARTICIPANT_DIM PP)
     SELECT EWP.USER_ID
           ,EWP.CANDIDATE_1_0_FLAG
       FROM DSS_ERS_STAGE.ES_W_PARTICIPANT_DIM EWP
      INNER JOIN NEW_USERS N
         ON (EWP.USER_ID = N.USER_ID)
      WHERE EWP.CANDIDATE_1_0_FLAG = 1)

转换尝试:

SELECT *
FROM (WITH NEW_USERS AS (SELECT WPP.USER_ID
                         FROM DSS_ERS_STAGE.ES_W_PARTICIPANT_DIM WPP
                       EXCEPT
                       SELECT PP.USER_ID FROM DSS_ERS_STAGE.ES_PARTICIPANT_DIM PP)
     SELECT EWP.USER_ID
           ,EWP.CANDIDATE_1_0_FLAG
       FROM DSS_ERS_STAGE.ES_W_PARTICIPANT_DIM EWP
      INNER JOIN NEW_USERS N
         ON (EWP.USER_ID = N.USER_ID)
      WHERE EWP.CANDIDATE_1_0_FLAG = 1) 

SQL Server 返回以下错误:

消息 156,级别 15,状态 1,第 2 行关键字“WITH”附近的语法不正确。

消息 319,级别 15,状态 1,第 2 行关键字“with”附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前面的语句必须以分号结束。

消息 102,级别 15,状态 1,第 11 行 ')' 附近的语法不正确。

标签: sqlsql-serveroracletsql

解决方案


SQL Server 不允许在子查询中使用 CTE

WITH NEW_USERS AS (SELECT WPP.USER_ID
                   FROM DSS_ERS_STAGE.ES_W_PARTICIPANT_DIM WPP
                   EXCEPT    -- Oracle has MINUS
                   SELECT PP.USER_ID 
                   FROM DSS_ERS_STAGE.ES_PARTICIPANT_DIM PP)
SELECT EWP.USER_ID
       ,EWP.CANDIDATE_1_0_FLAG
FROM DSS_ERS_STAGE.ES_W_PARTICIPANT_DIM EWP
INNER JOIN NEW_USERS N
   ON (EWP.USER_ID = N.USER_ID)
WHERE EWP.CANDIDATE_1_0_FLAG = 1;

第二件事:SQL Server 有EXCEPT关键字而不是MINUS.


推荐阅读