2016-10-25 9 views
2

J'ai besoin de récupérer le premier résultat.Fonction First Value pour retourner la valeur null dans Oracle

J'utilise la requête ci-dessous pour effectuer l'opération

select id,firstname,dob,assignment 
from (
    select table1.id as id, 
      table1.name as firstname, 
      table1.dob as dob, 
      First_value(table2.Res)over (partition by table2.id order by table2.date asc) f, 
      table2.Res as assignment 
    from table1,table2 
    where table1.id = table2.id and 
) where assignment = f 

laisse supposer qu'il n'y a pas des enregistrements dans table2. Dans ce cas, ma sortie attendue doit être

id firstname dob   assignment 
1 Ana   23/03/1960 null 

La requête fonctionne correctement s'il existe un enregistrement dans la table2. Mais la requête ci-dessus ne renvoie aucun résultat s'il n'y a aucun enregistrement pour un employé particulier dans table2.

+0

'... table1.id = table2.id et)' est une syntaxe * erreur * –

+0

de table1, table2 où table1.id = table2.id est un INNER JOIN, si table2 est vide le résultat est zéro lignes. Essayez avec LEFT OUTER JOIN –

Répondre

1

Essayez ceci:

SELECT id,firstname,dob,assignment 
FROM (
     SELECT table1.id as id, 
       table1.name as firstname, 
       table1.dob as dob, 
       First_value(table2.Res)over(partition by table2.id order by table2.date asc) f, 
       table2.Res as assignment 
     FROM table1 
     LEFT JOIN table2 ON table1.id = table2.id 
) WHERE (assignment = f OR (assignment IS NULL AND f IS NULL)) 
+0

Pas de chance :(Toujours son ne fonctionne pas –

+1

Juste raté que 'f' est colonne -Essayez mis à jour –

+1

Merci beaucoup :) –

1

Ceci est trop long pour un commentaire.

Bien sûr, votre requête ne renvoie aucune ligne si l'une des tables est vide. C'est ainsi qu'une jointure se joint et que les jointures internes fonctionnent.

On peut supposer que vous voulez un left join et une requête plus simple:

select t1.id as id, t1.name as firstname,t1.dob as dob, 
     First_value(t2.Res)over (partition by t2.id order by t2.date asc) f, 
     t2.Res as assignment 
from table1 t1 left join 
    table2 t2 
    on t1.id = t2.id and t2.Res = 'f'; 
+0

'où t2.Res = 'f'' est un problème car tous les champs de' t2' seront null s'il n'y a pas de ligne dans 't2'. –

+0

J'ai aussi essayé d'utiliser la jointure gauche. Encore il ne renvoie aucun résultat quand il n'y a pas d'entrées dans la deuxième table –