2010-05-13 13 views
2

J'ai un tableau des commandes pour des produits particuliers et un tableau des produits en vente. (Ce n'est pas une structure de base de données idéale, mais c'est hors de mon contrôle.) Ce que je veux faire, c'est joindre la table des commandes à la table des ventes par numéro de produit, mais je ne veux pas inclure de données particulières Je veux juste un Y si la jointure existe ou N si ce n'est pas dans la sortie. Quelqu'un peut-il expliquer comment je peux le faire en SQL?Je ne sais pas comment utiliser Decode, NVL et/ou isNull (ou autre chose?) Dans cette situation

Merci d'avance!

Répondre

4

Vous devriez être en mesure d'utiliser la CASE construction, et il ressemblerait à quelque chose comme ceci:

select 
    order.foo, 
    case 
     when sale.argle is null then 'N' 
     else 'Y' 
    end 
from order 
left join sale on order.product_number = sale.product_number; 
+0

Merci pour votre réponse rapide! Je vais essayer ça maintenant. – RSW

+1

Assurez-vous simplement que la vente est une relation 1-à-1 pour product_number. Par exemple, si les articles en vente ont été ventilés par région, votre client recevra quatre fois la même facture pour le même article (si l'article était en vente dans 4 régions) –

0

Essayez (non testé):

SELECT O.*, DECODE(NVL(p.product_num, 'X'), 'X', 'N', 'Y') 
    FROM Orders AS o LEFT JOIN Products AS p ON o.Product_Num = p.Product_Num 

Le NVL se traduira par des valeurs nulles dans le « p .product_num 'à' X ', qui sera égal à' X 'dans le DECODE, générant' N '; les numéros de produits non nuls seront un nombre, différent de 'X', et généreront donc un 'Y'.

+0

C'est dans le sens de ce que j'essayais de faire, mais Je pense que la première réponse est plus claire. Merci! – RSW

+0

(Votre réponse est parfaitement claire, je veux dire le code lui-même) – RSW

2

J'utilise nornally NVL2 pour ce type de situation ...

SELECT col_one 
    , NVL2(col_one, 'Y', 'N') col_one_exists 
    , col_two 
    , NVL2(col_two, 'Y', 'N') col_two_exists 
    FROM (SELECT '12345' col_one 
       , NULL col_two 
      FROM dual 
     ) 

reviendriez ceci: -

COL_ONE COL_ONE_EXISTS COL_TWO COL_TWO_EXISTS 
12345 Y       N 
+0

NVL2 est spécifique à Oracle - l'instruction CASE est ANSI, donc c'est plus portable. –

+1

La question a été marquée pour Oracle, j'ai donc répondu en conséquence. L'indépendance de la base de données n'est pas quelque chose que je recherche. Citation: "Vous voulez maximiser l'investissement dans votre base de données.Vous voulez développer le meilleur logiciel dans le moins de temps possible contre cette base de données.La seule façon de faire est d'exploiter pleinement ce que la base de données a à offrir." Oracle efficace par conception - Tom Kyte –