Comment puis-je supprimer le sous-requête de l'instruction select?

0

La question

J'ai besoin d'aide dans la suppression de la sous-requête de l'origine de l'instruction SELECT. Est-ce même possible? Je suis besoin de ce déplacer en fin de compte les requêtes de ce genre pour Denodo/VQL, qui n'autorise pas les sous-requêtes dans les instructions SELECT (mais ne permettent CTE/AVEC et les sous-requêtes à PARTIR de/OÙ).

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

La meilleure réponse

2

Je peux voir un couple d'options. La plus directe de la traduction semble être:

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%'

mais l'utilisation d'un RIGHT OUTER JOIN peut-être pas familiers. Pour passer de la plus familière LEFT OUTER JOIN nous devons inverser la position des tables dans la requête et modifier la façon dont les conditions sont présentées:

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%'

J'ai gardé l'alias de la même sorte que vous pouvez voir comment ils se sont déplacés autour de la requête. Dans les deux requêtes m1 est la table principale, qui est, il est le seul qui doit fournir des données, tandis que m2 est le secondaire ou "facultatif" table - il peut ou peut ne pas avoir de données qui correspond à la primaire.

Personnellement, je préfère les jointures sur les sous-requêtes que je les trouve plus facile à comprendre, mais YMMV.

2021-11-24 02:01:18

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................