0
votes

Fusionner quelques requêtes "SELECT INTO .." en une seule

J'ai une liste de sélections comme:

  SELECT id
  INTO   val_abc
  FROM   table_x
  WHERE  symbol = 'abc';

  SELECT id
  INTO   val_xyz
  FROM   table_x
  WHERE  symbol = 'xyz';

  SELECT id...

Est-il possible de fusionner quelques sélections de MÊME TABLE (!) en une seule?

p>


1 commentaires

Comme chaque sélection récupère une ligne différente, cela ne sera pas possible (et si c'est le cas, cela ne rendra pas le code plus lisible non plus)


3 Réponses :


1
votes

Oui, de plusieurs manières, par exemple

select id 
from tablex
where symbol = 'abc'
union all
select id
from tablex
where symbol = 'xyz'

ou

select id 
from tablex
where symbol = 'abc'
   or symbol = 'xyz'

ou

select id
from tablex
where symbol in ('abc', 'xyz')


2 commentaires

aww ... Désolé, j'ai oublié d'ajouter une clause. Pourrait regarder à nouveau?


Cela, évidemment, ne fonctionnera pas si val_abc est une variable scalaire (par exemple, déclarée comme val_abc number; ) car vous ne pouvez pas mettre plusieurs lignes < / i> dans une telle variable. Vous pouvez le faire en boucle, ou restreindre le nombre de lignes à exactement une (en appliquant where rownum = 1 ), mais je suppose que ce n'est pas ce que vous voulez. Ou, vous pouvez déclarer une variable de type personnalisé (une collection) et utiliser bulk collect . Il peut y avoir d'autres options, mais - veuillez expliquer le problème que vous essayez de résoudre car notre suggestion en dépend.



2
votes

Oui, vous pouvez combiner ces requêtes comme ici:

select v1, v2, v3
  into val_abc, val_def, val_xyz
  from (select id, symbol from table_x)
  pivot (max(id) for symbol in ('abc' v1, 'def' v2, 'xyz' v3));

ou même utiliser pivot (Oracle 11 ou plus récent):

select max(case symbol when 'abc' then id end),
       max(case symbol when 'def' then id end),
       max(case symbol when 'xyz' then id end)
  into val_abc, val_def, val_xyz
  from table_x
  where symbol in ('abc', 'def', 'xyz');

Démo dbfiddle

Remarque: si votre requête rencontre plus d'une ligne correspondante, l'application génère une erreur trop de lignes ou aucune donnée trouvée lorsqu'il n'y a pas de valeur. Ma solution utilise l'agrégation pour que les erreurs n'apparaissent pas - elle prend une valeur maximale ou nulle si rien n'est trouvé. Peu importe si table_x n'a qu'un seul identifiant correspondant pour chaque symbole, mais soyez conscient de cela.


0 commentaires

0
votes

Vous pouvez exprimer cela en utilisant des join s, si vous voulez vraiment:

SELECT abc.id, xyz.id
INTO val_abc, val_xyz
FROM table_x abc JOIN
     table_x xyz
     ON abc.symbol = 'abc' AND
        xyz.symbol = 'xyz';


0 commentaires