Как преобразовать предложение IN с коррелированным подзапросом в использование оператора WITH? - PullRequest
0 голосов
/ 01 мая 2020

Я хотел бы преобразовать коррелированный подзапрос в использование предложения WITH.

Следующий запрос:

select count(*)
from item_master im
left join item_branch ib
on im.IMLITM = ib.IBLITM
left join supply_item si
on im.IMLITM = si.PCLITM
where true
and trim(ib.IBSTKT) in ('P', '7')
and trim(ib.IBVEND) in (
    select distinct sii.PCAN8
    from supply_item sii
    where true
    and trim(sii.PCMCU) in ('MXN09M', 'USNELP', 'USNELS')
    and sii.PCAN8 not in (60001, 60002, 60003, 60004, 60005, 60006, 60007, 60008, 60009, 60011)
    and sii.PCLITM = ib.IBLITM ---------> CORRELATED SUBQUERY COMES HERE
)

Это моя попытка.

with tbl as (
select distinct sii.PCAN8 as PCAN, sii.PCLITM as PCLITM
    from supply_item sii
    where true
    and trim(sii.PCMCU) in ('MXN09M', 'USNELP', 'USNELS')
    and sii.PCAN8 not in (60001, 60002, 60003, 60004, 60005, 60006, 60007, 60008, 60009, 60011)
)
select count(*)
from item_master im
left join item_branch ib
on im.IMLITM = ib.IBLITM
left join tbl
on im.IMLITM = tbl.PCLITM
where true
and trim(ib.IBSTKT) in ('P', '7')
and trim(ib.IBVEND) in tbl.PCAN

Я получаю сообщение об ошибке no such table: tbl.PCAN. Я не уверен, почему я иду не так. Я предоставляю столбец для проверки для предложения in, как и прежде.

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Если вы вообще не можете использовать подзапрос, вы сможете заменить выражение IN условием LEFT JOIN. Без выборочных данных невозможно быть уверенным на 100%, но это должно работать:

with tbl as (
    select distinct sii.PCAN8 as PCAN, sii.PCLITM as PCLITM
    from supply_item sii
    where true
      and trim(sii.PCMCU) in ('MXN09M', 'USNELP', 'USNELS')
      and sii.PCAN8 not in (60001, 60002, 60003, 60004, 60005, 60006, 60007, 60008, 60009, 60011)
)
select count(*)
from item_master im
left join item_branch ib on im.IMLITM = ib.IBLITM
left join tbl on im.IMLITM = tbl.PCLITM and trim(ib.IBVEND) = tbl.PCAN
where true
  and trim(ib.IBSTKT) in ('P', '7')
0 голосов
/ 01 мая 2020

Правильный синтаксис должен был бы выбрать PCAN из CTE:

WITH tbl AS (
    SELECT DISTINCT sii.PCAN8 AS PCAN, sii.PCLITM AS PCLITM
    FROM supply_item sii
    WHERE TRIM(sii.PCMCU) IN ('MXN09M', 'USNELP', 'USNELS') AND
          sii.PCAN8 NOT IN (60001, 60002, 60003, 60004, 60005, 60006, 60007, 60008, 60009, 60011)
)

SELECT COUNT(*)
FROM item_master im
LEFT JOIN item_branch ib ON im.IMLITM = ib.IBLITM
LEFT JOIN tbl ON im.IMLITM = tbl.PCLITM
WHERE
    TRIM(ib.IBSTKT) IN ('P', '7') AND
    TRIM(ib.IBVEND) IN (SELECT PCAN FROM tbl);  -- change is here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...