2009-10-19 5 views
0

J'ai une requête comme ceci:Une requête: sélectionner renvoie des données *, mais sélectionnez la colonne ne retourne pas

select pln.* 
    from plan pln 
where pln.id = '0003' 
    and pln.seq = (select max(pln_es.seq) 
        from plan pln_es 
        where pln_es.id = pln.emplid 
        and pln_es.career =pln.career 
        and pln_es.nbr = pln.nbr 
        and pln_es.dt = pln.dt) 

Cependant, si je (Sélectionner la colonne ...), en utilisant les mêmes conditions, ça ne retourne pas de données! Cela n'a aucun sens pour moi.

est ici la requête qui ne retourne pas:

select pln.MYDATE 
    from plan pln 
where pln.id = '0003' 
    and pln.seq = (select max(pln_es.seq) 
        from plan pln_es 
        where pln_es.id = pln.emplid 
        and pln_es.career =pln.career 
        and pln_es.nbr = pln.nbr 
        and pln_es.dt = pln.dt) 

que quelqu'un sait pourquoi cela pourrait-il être happenning? La colonne en soi est une date et la base de données est Oracle 10g

+7

postez l'autre requête s'il vous plaît. – markus

+0

Voulez-vous dire renvoie aucune donnée comme dans les lignes zéro? Et le select * renvoie> 0 lignes? – ongle

+0

L'objectif est-il d'utiliser les valeurs de date maximum de la même table? –

Répondre

0

Est-ce que MYDATE est toujours NULL dans les lignes retournées? SQL (au moins certaines implémentations, je ne suis pas familier avec Oracle) supprimera les lignes constituées de valeurs entièrement NULL de l'ensemble de résultats.

+0

Plus intéressant, la réponse est Non. Quand je fais le select *, la colonne MyDate a des données. Merci pour votre commentaire. –

0

Pour les jointures ci-dessous je vérifierais pour: 1) Comparez-vous différents types dans votre sous-requête? 2) Est-ce que l'une des colonnes de nombre que vous joignez null, cela semble causer des problèmes.

Rejoint regarder ...

pln_es.id = pln.emplid 
and pln_es.career =pln.career 
and pln_es.nbr = pln.nbr 
and pln_es.dt = pln.dt 

ont également essayé de vous voir des résultats d'une requête comme celui-ci retourne quoi que ce soit.

select pln.MYDATE 
    from plan pln 
where pln.id = '0003' 
    and pln.seq = (select max(pln_es.seq) 
        from plan pln_es 
        where pln_es.id = <insert hard coded value> 
        and pln_es.career =<insert hard coded value> 
        and pln_es.nbr = <insert hard coded value> 
        and pln_es.dt = <insert hard coded value>) 
+0

Toutes mes colonnes ont des valeurs.Cependant, lors de l'insertion de valeurs codées en dur, il commence à retourner des données ... ummm-- Je suppose que je dois y travailler un peu plus. –

1

En admettant que vous n'utilisez pas un niveau d'isolation des transactions bâclée, et que les données ne change pas entre les exécutions, ce que vous avez décrit ne devrait pas se produire et est probablement un bug. La requête prévoit de sélectionner une colonne plutôt que de sélectionner tout ce qui peut être très différent s'il y a un index de couverture pour une colonne, donc le fait que le bogue apparaisse dans une requête mais pas dans l'autre n'est pas une surprise. (De même, s'il n'y a pas de bogue, mais que vous autorisez les lectures corrompues, vous pouvez les obtenir d'un plan mais pas de l'autre.) Vous pouvez essayer de reconstruire des index utilisés par la requête qui produit des résultats erronés. Vous pouvez également voir si vous utilisez l'une des fonctionnalités qui apparaissent fréquemment à proximité de l'expression "mauvais résultats" dans les listes de corrections de bogues Oracle comme this one.

0

légèrement hors-sujet, mais votre requête serait mieux écrit:

select MYDATE 
    from (Select plan.*, 
       max(pln_es.seq) Over (id,career,nbr) max_seq 
      from plan 
     where id = '0003') 
where seq = max_seq; 

intéressant de voir si cette requête a le même problème.

Questions connexes