sql - 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 行 ')' 附近的语法不正确。
解决方案
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
.
推荐阅读
- javascript - 在 Angular 中的单选按钮上选择所有实现
- javascript - 为几个输入 Vue.js 计算出不同的结果
- python - 如何在不更改主分支的情况下更改本地 git 存储库的功能分支?
- scala - java.lang.NoSuchMethodError:com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
- php - 参数中的 URL 重定向到 403?
- python - 如何在python中为不同的条形图组赋予不同的颜色?
- java - 为什么从其他类调用 JPanel 会给出 NullPointerException 错误?
- javascript - 如何将物体的道具从一个位置转移到另一个位置?
- java - 如何在 Dialogflow Java API 中创建 SessionsClient 时传递密钥 json 文件
- f# - 从函数返回可区分联合的替代方法是什么?