2009-11-06 3 views
0

J'ai cette requête:ne se trouvent pas dans le résultat des critères

select BUnit, value from myTable where BUnit in (555,556,557,558) 

et ces valeurs pour Bunit sont construites dynamiquement, à savoir. un programme construit des requêtes à la demande, et ne sélectionne pas toujours ces numéros.

Un résultat de requête possible serait

Bunit   value 
556    10.2 
558    5.18 

Cependant, je voudrais construire une instruction select pour retourner

Bunit   value 
556    10.2 
558    5.18 
555    NULL 
557    NULL 

Je ne suis pas autorisé à créer des tables (temporaires ou non) et créer des procédures. Comment puis-je le faire?

+0

Pourriez-vous expliquer davantage ce que vous entendez par « valeurs pour BUnit sont construites dynamiquement »? Pour moi, la requête semble correcte compte tenu des données que vous avez fournies. –

Répondre

1

Vous pouvez construire une table avec les critères et joignez-vous sur ce point:

select criteria.BUnit, t.value 
from (
    select 555 as BUnit from dual 
    union select 556 from dual 
    union select 557 from dual 
    union select 558 from dual 
) criteria 
left join myTable t 
    on t.BUnit = criteria.BUnit 
+0

devrait être UNION ALL –

+0

@Stephanie Page: Cela devrait fonctionner très bien avec UNION. – Andomar

0

Sans une table temporaire, vous ne pouvez pas puisque vous devez trouver un moyen de mettre toutes les valeurs de BUnit dans une table quelconque, puis rejoindre myTable contre cette table pour obtenir les valeurs NULL.

Vous pouvez générer le SQL dynamique dans votre application et faire descendre quelque chose comme ceci:

select 555, (select value from myTable where BUnit = 555) 
from dual 
union 
select 556, (select value from myTable where BUnit = 556) 
from dual 
... 

Mais avant d'essayer cela, je vous suggère de créer la structure de résultat souhaité dans votre application, puis remplir le les valeurs que vous obtenez de la base de données.

Questions connexes