J'essaye de renvoyer une requête (serveur SQL et oracle) que chaque colonne est faite par une requête différente. Donc la première colonne appelée "presentes" est:
SELECT (SELECT TABLE1.NAME FROM TABLE1 WHERE TABLE1.SESSION = 92) AS presentes, (SELECT TABLE2.NAME FROM TABLE2 WHERE TABLE2.SESSION = 92 AND TABLE2.DATE > '[somedateGoesHere]') as justificados, (SELECT TABLE3.NAME FROM TABLE3 WHERE TABLE3.SESSION = 92) as ausentes
La deuxième colonne appelée "justificados" est:
SELECT TABLE3.NAME FROM TABLE3 WHERE TABLE3.SESSION = 92
La troisième colonne appelée " ausentes "est:
SELECT TABLE2.NAME FROM TABLE2 WHERE TABLE2.SESSION = 92 AND TABLE2.DATE > '[somedateGoesHere]'
J'essaye donc de mettre toutes ces informations dans une seule requête, comme:
SELECT TABLE1.NAME FROM TABLE1 WHERE TABLE1.SESSION = 92
L'idée est de renvoyer quelque chose comme ceci:
Mais je reçois cette erreur:
La sous-requête a renvoyé plus d'une valeur. Cela n'est pas autorisé lorsque la sous-requête suit =,! =, ,> = Ou lorsque la sous-requête est utilisée comme expression.
Je sais que c'est parce que la troisième colonne a plus d'une valeur. Mais comment puis-je ajouter des valeurs "nulles" aux autres colonnes pour résoudre ce problème?
3 Réponses :
Commencez à partir de TABLE3 et effectuez une jointure à gauche contre les deux autres
SELECT t1.NAME as presentes, t2.name AS justificados, t3.NAME as ausentes FROM TABLE3 t3 LEFT JOIN TABLE1 t1 ON t3.session = t1.session LEFT JOIN TABLE2 t2 ON t3.session = t2.session AND t2.DATE = '[someDate]' WHERE t3.SESSION = 92
ou la dernière condition peut être utilisée directement dans la jointure
SELECT t1.NAME as presentes, t2.name AS justificados, t3.NAME as ausentes FROM TABLE3 t3 LEFT JOIN TABLE1 t1 ON t3.session = t1.session LEFT JOIN TABLE2 t2 ON t3.session = t2.session WHERE t3.SESSION = 92 AND t2.DATE = '[someDate]'
Mes clauses WHERE sont différentes de chaque sous-requête
Vous voulez dire que la session n’a pas la même valeur pour tous? Et pourquoi le vote à la baisse?
La session a la même valeur, mais les clauses WHERE sont différentes. Certains ont une comparaison de dates comme vous pouvez le voir sur ma question principale
@aseolin Oui et je l'ai aussi dans ma clause where! Regardez la dernière rangée.
vous pouvez utiliser l'union de tous
SELECT TABLE1.NAME as presentes, '' as justificados,'' as ausentes FROM TABLE1 WHERE TABLE1.SESSION = 92 union all SELECT '',TABLE2.NAME,'' FROM TABLE2 WHERE TABLE2.SESSION = 92 AND TABLE2.DATE > '[somedateGoesHere]' union all SELECT '','', TABLE3.NAME FROM TABLE3 WHERE TABLE3.SESSION = 92
Vous pouvez utiliser row_number () avec union all et faire une agrégation conditionnelle:
select max(case when tb = 'table1' then name end) as presentes,
max(case when tb = 'table2' then name end) as justificados,
max(case when tb = 'table3' then name end) as ausentes
from (select 'table1' as tb, name, row_number() over (order by (select 1)) as seq
from table1
where SESSION = 92
union all
select 'table2', name, row_number() over (order by (select 1))
from table2
where SESSION = 92 AND DATE > '[somedateGoesHere]'
union all
select 'table3', name, row_number() over (order by (select 1))
from table3
where SESSION = 92
) t
group by seq;
Est-ce que ça fait du sens? Vos colonnes sont des ensembles de données indépendants. Pourquoi les voudriez-vous dans une seule table?
Parce que j'utilise le rapport Jasper et que je dois définir ces informations dans un seul ensemble de données
Pourquoi voulez-vous 3 colonnes? N'est-il pas suffisant d'avoir une union tout balisant chaque requête pour savoir d'où viennent les données? Ensuite, vous pouvez pivoter si vous le souhaitez, mais ne savez pas pourquoi vous avez besoin de ces données étranges et indépendantes dans les colonnes
Pouvez-vous me montrer un exemple? Comme je l'ai dit, cela sera transformé en un rapport de Jasper, mais Jasper a certaines limites, donc je dois regrouper ces requêtes sans rapport.