Преобразование Oracle в T-SQL.Как я могу сделать эту работу? - PullRequest
0 голосов
/ 06 июня 2018

Проблемы с преобразованием синтаксиса 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 голосов
/ 06 июня 2018

Джейми упомянул об этом в комментарии, но я постараюсь объяснить немного подробнее.В целях иллюстрации предположим, что у меня есть две очень простые таблицы:

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

Однако документация для общих табличных выражений явно заявляет:

Дубликаты имен в пределах одного определения 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 есть столбец с именем LOCAL_COUNCIL.Убедитесь, что имена ваших столбцов уникальны в вашем CTE, и с вами должно быть все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...