SQL: преобразование подзапроса в общее табличное выражение - PullRequest
1 голос
/ 05 июля 2019

Я изучаю SQL в курсе, и я работаю с SQL на MS SQL Server (так, T-SQL).Я пытаюсь перефакторинг подзапроса, используя общее табличное выражение (CTE).Вот рабочая версия подзапроса:

SELECT  PAT_ENC_CSN_ID 'CSN',
        ADMISSION_PROV_ID 'Provider ID'

FROM PAT_ENC_HSP

WHERE ADMISSION_PROV_ID IN (
    SELECT DISTINCT PROV_ID
    FROM CL_SER_HIM_LST_VST
    WHERE HIM_STATUS_C <> 1001
    )

Я думал, что CTE был (почти) заменой, поэтому я попытался сделать следующее:

WITH Not_Good AS (  SELECT DISTINCT PROV_ID
                    FROM CL_SER_HIM_LST_VST
                    WHERE HIM_STATUS_C <> 1001
                 )

SELECT  PAT_ENC_CSN_ID 'CSN',
        ADMISSION_PROV_ID 'Provider ID'

FROM PAT_ENC_HSP

WHERE PAT_ENC_HSP.ADMISSION_PROV_ID IN (Not_Good.PROV_ID)

Но яполучаю синтаксическую ошибку в последнем WHERE предложении: The multi-part identifier "Not_Good.PROV_ID" could not be bound.

В чем здесь проблема?

У меня нет JOIN с отсутствующим ON условием, и при этом я не вижу отсутствующего псевдонима.

Заранее спасибо за ваше время!

1 Ответ

5 голосов
/ 06 июля 2019

Вы очень близки, но вы не можете использовать CTE в выражении «IN» так, как вы перечислили выше. Вы можете сделать это, хотя:

WITH Not_Good AS (  SELECT DISTINCT PROV_ID
                    FROM CL_SER_HIM_LST_VST
                    WHERE HIM_STATUS_C <> 1001
                 )

SELECT  PAT_ENC_CSN_ID 'CSN',
        ADMISSION_PROV_ID 'Provider ID'

FROM PAT_ENC_HSP

WHERE PAT_ENC_HSP.ADMISSION_PROV_ID IN (select PROV_ID from Not_Good)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...