2010-06-10 10 views
0

Je dois sélectionner le nom et le prénom dans une table qui fonctionne correctement dans le SQL suivant, mais la partie qui ne fonctionne pas est la fonction NVL. Le fichier devrait montrer à tous les pilotes d'une compagnie qui volent des hélicoptères et SI ils n'ont pas de licence le champ HT_NAME devrait apparaître comme 'N/A' et le champ pour les heures de vol devrait être 0. J'ai mis la fonction NVL en tant que détails de mon texte, mais il ne fonctionne toujours pas. Ai-je fait une erreur de syntaxe? L'aide serait appréciée.En utilisant la fonction NVL dans SQL, aidez s'il vous plaît!

Select E.EMP_NBR, E.EMP_FIRSTNAME || ' ' || E.EMP_LASTNAME, E.EMP_PILOT, 
     ED.HT_NBR, NVL(HT.HT_NAME, 'N/A'), NVL(ED.END_HRS_FLOWN, 0), 
     ED.END_LAST_ANNUAL_REVIEW_DATE 
From ENDORSEMENT ED, EMPLOYEE E, HELICOPTER_TYPE HT 
WHERE HT.HT_NBR = ED.HT_NBR (+) 
ORDER BY ED.END_HRS_FLOWN DESC, E.EMP_FIRSTNAME || ' ' || E.EMP_LASTNAME ASC; 

devrait informer les employés qui ne sont pas les pilotes apparaissent avec une N/A sous le type héliski et 0 en heures de vol. Cela ne fonctionne pas - même si j'ai essayé plusieurs choses pour le réparer.

+0

Qu'obtenez-vous lorsque vous attendiez que 'N/A' et 0 apparaissent? –

+0

Les valeurs restent les mêmes qu'avant ... elles ne changent pas du tout! – Mila

+0

Pouvez-vous poster les résultats que vous obtenez lors de l'exécution de la requête – Bharat

Répondre

1

Vous avez trois tables et une seule condition de jointure; vous avez besoin d'une jointure entre Employee et Endorsement. Sans cela, vous obtenez une jointure entre produits ou cartésienne entre ces tables. Avec N tables (N> 0), vous avez besoin de J = N-1 conditions de jointure au minimum. Vous avez N = 3 tables, mais J = 1 conditions de jointure - ce qui est trop peu. (Il y a plusieurs raisons pour lesquelles vous pourriez avoir besoin de J> N - 1, mais la principale est que vous devez joindre deux colonnes entre deux tables si vous comptez chaque condition 'A.Col1 = B.Col2' comme une condition de jointure séparée , alors vous avez besoin de J> N-1, si vous comptez la paire de conditions 'A.Col1 = B.Col2 et A.Col3 = B.Col4' comme une seule condition de jointure, alors vous avez seulement besoin de J = N-1 conditions.)

Idéalement, vous devez également vous éloigner de la notation de jointure externe archaïque et non standard en utilisant '(+)' et utiliser les jointures SQL standard.


La notation est un problème secondaire. Chaque ligne dans Employee est jointe à chaque ligne dans Endorsement - et ensuite ce produit croisé est associé à Helicopter_type. C'est (presque certainement) pas la requête qui est requise.

Vous devez probablement ajouter une certaine variation de ce à la clause WHERE:

AND E.EMP_NBR = ED.EMP_NBR 

(où la colonne réelle dans le tableau d'entérinement (ED) ne figure pas dans la requête, de sorte que « ED.EMP_NBR » est une supposition). Entre autres effets, s'il y a des pilotes d'hélicoptère dans la base de données, alors chaque enregistrement d'employé est joint avec l'approbation pour un pilote de temps en temps, et l'ordre de tri signifie que ces enregistrements seront montrés avant la myriade les dossiers qui montrent que les pilotes n'ont pas d'avenants d'hélicoptère et que les non-pilotes n'ont pas de dossier d'hélicoptère, etc ...

+0

ce fut la façon dont j'ai été enseigné, merci bien que regarder ailleurs en ligne pour une autre façon de rejoindre. – Mila

+0

+1 pour la recommandation sur l'utilisation de la syntaxe JOIN. Cela illustre précisément l'un des avantages de JOINs par rapport à l'ancienne syntaxe: clarté/lisibilité. – DCookie

+0

@DCookie: la clarté et la lisibilité ne sont pas inhérentes à la syntaxe de jointure ANSI. Je suis programmeur Oracle depuis 20 ans et je trouve la plupart de la syntaxe ANSI presque incompréhensible. Sans aucune formation dans la nouvelle syntaxe, vous pourriez aussi bien écrire en grec, la plupart du temps. – AndyDan

0

Vérifiez si les valeurs HT_NAME et END_HRS_FLOWN étaient nulles ou non pour les lignes que vous attendez N/A ou 0

Modifier 1

Dans Oracle, la fonction NVL vous permet de substituer une valeur lorsqu'une valeur nulle est rencontrée.

La syntaxe de la fonction NVL est:

NVL(string1, replace_with) 

chaine1 est la chaîne à tester pour une valeur nulle.

remplacez par la valeur renvoyée si string1 est null.

Si la valeur est non nulle , elle retourne même valeur

+0

ils le font! Merci quand même! – Mila

1

Comme l'a dit @ Jonathan, vous avez besoin d'ajouter quelque chose à la clause WHERE pour dire la base de données comment correspondre EMPLOYÉ AVENANT. Pour les besoins de la discussion, nous utiliserons le champ EMP_NBR sur les deux, mais vous devrez changer la requête pour utiliser le champ correct. Nous devons également savoir quel champ vous indique si un employé a une licence valide. Je suppose que c'est quelque chose sur la table ENDORSEMENT - appelons-le ENDORSEMENT.LICENSE_TYPE à des fins de discussion. Une fois que vous savez que vous pouvez utiliser la fonction NVL2 pour modifier les valeurs renvoyées par la requête appropriée, comme suit:

SELECT E.EMP_NBR, 
     E.EMP_FIRSTNAME || ' ' || E.EMP_LASTNAME AS FIRST_LAST_NAME, 
     E.EMP_PILOT, 
     ED.HT_NBR, 
     NVL2(ED.LICENSE_TYPE, HT.HT_NAME, 'N/A') HELO_TYPE, 
     NVL2(ED.LICENSE_TYPE, ED.END_HRS_FLOWN, 0) FLOWN_HOURS, 
     ED.END_LAST_ANNUAL_REVIEW_DATE 
    FROM ENDORSEMENT ED, 
     EMPLOYEE E, 
     HELICOPTER_TYPE HT 
    WHERE HT.HT_NBR = ED.HT_NBR (+) AND 
     ED.EMP_NBR = E.EMP_NBR (+) 
    ORDER BY ED.END_HRS_FLOWN DESC, 
      E.EMP_LASTNAME ASC, 
      E.EMP_FIRSTNAME ASC; 

J'ai aussi changé la clause ORDER BY pour obtenir les employés commandés de façon plus normale.

Partagez et appréciez.

+0

Point intéressant - Je n'aurais pas mis la deuxième notation de jointure externe, mais il est probablement nécessaire d'avoir une jointure externe entre Employee et Endorsement; Je me demande, cependant, si la jointure entre Endorsement et Helicopter_Type devrait être une jointure interne, après tout? Fondamentalement, c'est un détail pour le PO à résoudre, cependant. –

+0

Salut, merci pour cela, la chose est la table des employés n'a pas PK ou FK je peux utiliser pour le joindre aux autres tables c'est pourquoi je n'ai pas créer une jointure pour elle, si theres pas PK ou FK disponible pouvez-vous encore rejoins-les? On m'a dit autrement! On m'a dit que SI il n'y a pas de clé étrangère disponible pour la jointure, vous ne pouvez pas joindre deux tables. – Mila

+0

Oh, en fait cela fonctionne, vous avez raison, dans le champ de licence que vous avez ajouté, j'ai mis le champ EMP_PILOT, mais ce n'est pas une valeur NULL c'est un CHAR. Si elles SONT un pilote c'est un Y sinon ça se présente comme un N. Donc je ne sais pas si NVL fonctionnera sur cette base puisqu'il n'y a pas de NULL. – Mila