Oracle到T-SQL的转换。我怎样才能做到这一点?

时间:2018-06-06 14:44:50

标签: sql sql-server oracle tsql plsql

无法将Oracle语法转换为T-SQL。试图转换以下声明:

SELECT ORIG.*
,V.COUNTRY_COMMON_NAME
FROM 
(SELECT O.*
  ,LC.LOCAL_COUNCIL
  ,LC.REGIONAL_COUNCIL
FROM ES_W_ORG_DIM_INIT O
LEFT JOIN ES_W_ORG_DIM_INIT CNTR ON (O.RSC_CNTR_ORG_ID = CNTR.ORG_ID)
LEFT JOIN ES_W_LCL_CNCL_BASE LC ON (TO_CHAR(O.STK_DIST_UNIT_NUMBER) = 
TRIM(LC.UNITNUMBER))
WHERE O.ORG_TYPE_ID IN (7,8)
UNION
SELECT O.*
  ,LC.LOCAL_COUNCIL
  ,LC.REGIONAL_COUNCIL
FROM ES_W_ORG_DIM_INIT O
LEFT JOIN ES_W_ORG_DIM_INIT CNTR ON (O.RSC_CNTR_ORG_ID = CNTR.ORG_ID)
LEFT JOIN ES_W_LCL_CNCL_BASE LC ON (TO_CHAR(O.UNIT_NUMBER) = 
TRIM(LC.UNITNUMBER))
WHERE O.ORG_TYPE_ID IN (5,6)
UNION
SELECT O.*
  ,NULL AS LOCAL_COUNTCIL
  ,NULL AS REGIONAL_COUNCIL
FROM ES_W_ORG_DIM_INIT O
WHERE O.ORG_TYPE_ID IN (60,61)
) ORIG
LEFT JOIN DW_ERSDB_ORG_ADDR_VW V ON (ORIG.ORG_ID = V.ORG_ID AND 
V.ORG_ADDRESS_TYPE_ID = 1)

尝试转换:

WITH ORIG AS(
SELECT O.*
  ,LC.LOCAL_COUNCIL
  ,LC.REGIONAL_COUNCIL
FROM DSS_ERS_STAGE.ES_ORG_DIM O
LEFT JOIN DSS_ERS_STAGE.ES_ORG_DIM CNTR ON (O.RSC_CNTR_ORG_ID = CNTR.ORG_ID)
LEFT JOIN DSS_ERS_STAGE.ES_W_LCL_CNCL_BASE LC ON (CONVERT(VARCHAR, 
O.STK_DIST_UNIT_NUMBER) = RTRIM(LTRIM(LC.UNITNUMBER)))
WHERE O.ORG_TYPE_ID IN (7,8)
UNION
(SELECT O.*
  ,LC.LOCAL_COUNCIL
  ,LC.REGIONAL_COUNCIL
FROM DSS_ERS_STAGE.ES_ORG_DIM O
LEFT JOIN DSS_ERS_STAGE.ES_ORG_DIM CNTR ON (O.RSC_CNTR_ORG_ID = CNTR.ORG_ID)
LEFT JOIN DSS_ERS_STAGE.ES_W_LCL_CNCL_BASE LC ON (CONVERT(VARCHAR, 
O.UNIT_NUMBER) = RTRIM(LTRIM(LC.UNITNUMBER)))
WHERE O.ORG_TYPE_ID IN (5,6)
UNION
SELECT O.*
  ,NULL AS LOCAL_COUNCIL
  ,NULL AS REGIONAL_COUNCIL
FROM DSS_ERS_STAGE.ES_ORG_DIM O
WHERE O.ORG_TYPE_ID IN (60,61)
))
SELECT ORIG.*, V.COUNTRY_COMMON_NAME
FROM ORIG
LEFT JOIN DSS_ERS_STAGE.DW_ERSDB_ORG_ADDR_VW V ON (ORIG.ORG_ID = V.ORG_ID 
AND 
V.ORG_ADDRESS_TYPE_ID = 1)

*请注意,目标数据库中需要指定的模式

SQL Server错误:

Msg 8156, Level 16, State 1, Line 1
The column 'LOCAL_COUNCIL' was specified multiple times for 'ORIG'.

关于如何设计它以使其在SQL Server中运行的任何想法?

1 个答案:

答案 0 :(得分:2)

Jamie在评论中提到了这一点,但我会尝试更详细地解释一下。为了便于说明,假设我有以下两个非常简单的表。

create table CouncilA (LOCAL_COUNCIL int);
create table CouncilB (LOCAL_COUNCIL int);

insert CouncilA values (1);
insert CouncilB values (1);

SQL Server允许您查询具有非唯一列名的结果集。例如,以下是合法的:

select *
from
    CouncilA A
    inner join CouncilB B on A.LOCAL_COUNCIL = B.LOCAL_COUNCIL;

它产生以下结果集:

LOCAL_COUNCIL   LOCAL_COUNCIL
1               1

但是,documentation for common table expressions明确指出:

  

不允许在单个CTE定义中使用重复的名称。

因此,如果我尝试像我一样包装我之前的查询,就像您在尝试转换中所做的那样:

with CTE as
(
    select *
    from
        CouncilA A
        inner join CouncilB B on A.LOCAL_COUNCIL = B.LOCAL_COUNCIL
)
select * from CTE;

然后我收到您正在看到的错误消息:

Msg 8156, Level 16, State 1, Line 7
The column 'LOCAL_COUNCIL' was specified multiple times for 'CTE'.

顺便提一下,对于子SELECT

也是如此
select * from
(
    select *
    from
        CouncilA A
        inner join CouncilB B on A.LOCAL_COUNCIL = B.LOCAL_COUNCIL
) X;

结果:

Msg 8156, Level 16, State 1, Line 13
The column 'LOCAL_COUNCIL' was specified multiple times for 'X'.

您看到的错误消息是指ORIG,这是您的CTE的名称,因此该CTE的定义有多个名为LOCAL_COUNCIL的列,这可能意味着您的ES_W_ORG_DIM_INIT table有一个名为LOCAL_COUNCIL的列。确保您的列名在CTE中是唯一的,您应该没问题。