Как я могу удалить подзапрос из инструкции select?

0

Вопрос

Мне нужна помощь в удалении подзапроса из исходного оператора SELECT. Возможно ли это вообще? Мне это нужно, чтобы в конечном итоге переместить подобные запросы в Denodo/VQL, который не разрешает подзапросы в операторах SELECT (но разрешает CTE/С и подзапросы в / ОТКУДА).

select case when material in (
    select material
    from schema.material_table
    where old_material like '%55AD%'
  ) then 'Found'
  else 'Not Found'
end
from schema.material_table;
1

Лучший ответ

2

Я вижу пару вариантов. Наиболее прямым переводом, по-видимому, является:

SELECT CASE
         WHEN m2.MATERIAL IS NOT NULL THEN 'Found'
         ELSE 'Not Found'
       END AS IZZIT_THERE
  FROM SCHEMA.MATERIAL_TABLE m2
  RIGHT OUTER JOIN SCHEMA.MATERIAL_TABLE m1
    ON m1.MATERIAL = m2.MATERIAL
  WHERE m1.OLD_MATERIAL LIKE '%55AD%'

но использование RIGHT OUTER JOIN может быть, незнаком. Чтобы переключиться на более привычное LEFT OUTER JOIN нам нужно изменить положение таблиц в запросе и изменить способ представления условий:

SELECT CASE
         WHEN m1.MATERIAL IS NOT NULL THEN 'Found'
         ELSE 'Not Found'
       END AS IZZIT_THERE
  FROM SCHEMA.MATERIAL_TABLE m1
  LEFT OUTER JOIN SCHEMA.MATERIAL_TABLE m2
    ON m2.MATERIAL = m1.MATERIAL
  WHERE m1.OLD_MATERIAL LIKE '%55AD%'

Я сохранил псевдонимы прежними, чтобы вы могли видеть, как они перемещались в запросе. В обоих запросах m1 является основной таблицей, то есть это та, которая должна предоставлять данные, в то время как m2 является вторичной или "необязательной" таблицей - в ней могут быть или не быть данные, соответствующие основной.

Лично я предпочитаю объединения подзапросам, так как нахожу их более понятными, но YMMV.

2021-11-24 02:01:18

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................