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>
3 Réponses :
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')
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.
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');
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.
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';
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)