Oracle SQL par ordre dans les problèmes de sous-requête!
Je suis en train de lancer une sous-requête dans Oracle SQL, et il ne me laisse pas l'ordre de la sous-requête des colonnes. La commande de la sous-requête est important que Oracle semble choisir à qui de retour de colonnes pour revenir à la requête principale.
select ps.id, ps.created_date, pst.last_updated, pst.from_state, pst.to_state,
(select last_updated from mwcrm.process_state_transition subpst
where subpst.last_updated > pst.last_updated
and subpst.process_state = ps.id
and rownum = 1) as next_response
from mwcrm.process_state ps, mwcrm.process_state_transition pst
where ps.created_date > sysdate - 1/24
and ps.id=pst.process_state
order by ps.id asc
Devrait vraiment être:
select ps.id, ps.created_date, pst.last_updated, pst.from_state, pst.to_state,
(select last_updated from mwcrm.process_state_transition subpst
where subpst.last_updated > pst.last_updated
and subpst.process_state = ps.id
and rownum = 1
order by subpst.last_updated asc) as next_response
from mwcrm.process_state ps, mwcrm.process_state_transition pst
where ps.created_date > sysdate - 1/24
and ps.id=pst.process_state
order by ps.id asc
source d'informationauteur Kevin Parker
Vous devez vous connecter pour publier un commentaire.
Fait "commande" n'a de sens que sur la plupart des requêtes -- si vous commandez dans une sous-requête, la requête externe est autorisé à brouiller les résultats, de sorte que la sous-requête de la commande ne fait quasiment rien.
Il semble que vous voulez juste pour obtenir le minimum last_updated qui est supérieur à la tvp.last_updated -- son plus facile quand vous le regardez comme un minimum (un ensemble), plutôt que d'une première ligne (qui engendre d'autres problèmes, comme quoi si il y a deux lignes à égalité next_response?)
Donner un coup de cette. Fair warning, depuis quelques années, j'ai eu Oracle en face de moi, et je ne suis pas habitué à la sous-requête en tant que colonne de la syntaxe; si ce coups je vais faire une version avec elle dans la clause from.
Les deux scf et les Dems ont fourni les requêtes alternatives. Je voulais juste lancer dans une explication sur les raisons de votre requête n'est pas se comporter de la manière que vous l'espériez.
Si vous avez une requête qui inclut un numéro de rangée et une COMMANDE PAR, Oracle s'applique la ROWNUM d'abord et ensuite la COMMANDE PAR. Ainsi la requête
obtient un nombre arbitraire de 5 lignes à partir de la
EMP
table et les trie-presque certainement pas ce qui était prévu. Si vous voulez obtenir le "N" lignes à l'aide de ROWNUM, vous devez nid de la requête. Cette requêtetrie les lignes dans la table EMP et renvoie le premier 5.
J'ai vécu cela moi-même et vous devez utiliser la fonction ROW_NUMBER(), et un niveau de sous-requête, au lieu de rownum...
Il suffit de montrer le nouveau sous-requête, quelque chose comme...
Une alternative serait d'utiliser MIN au lieu...
Confirmé la réponse est simplement faux.
Considérons une sous-requête qui génère une ligne unique numéro d'index.
Par exemple
ROWNUM
dans Oracle.Vous avez besoin de la sous-requête pour créer le numéro d'enregistrement unique pour les services de téléappel (voir ci-dessous).
Considérer l'exemple de requête suivant:
La requête interne est exactement la même requête, mais
DISTINCT
sur T0.Vous ne pouvez pas placer le
ROWNUM
sur la requête externe depuis leLEFT JOIN
(s) pourrait générer beaucoup plus de résultats.Si vous pouvez commander la requête interne (
T1.Name DESC
) générésROWNUM
dans l'intérieur de la requête match.Puisque vous ne pouvez pas utiliser un
ORDER B
Y dans la sous-requête le nombre habitude de match et sera inutile.Remercier dieu pour
ROW_NUMBER OVER (ORDER BY ...)
qui résout ce problème.Bien que n'étant pas pris en charge par tous les moteurs de base de données.
L'une des deux méthodes,
LIMIT
(ne nécessite pas deORDER
) et leROW_NUMBER() OVER
couvrira la plupart des moteurs de base de données.Mais encore, si vous n'avez pas l'une de ces options, par exemple la
ROWNUM
est votre seule option, alors uneORDER BY
sur la sous-requête est un must!