2010-10-27 6 views
0

Question sur SQL View. Essayer de développer une vue à partir de deux tables. Les deux tables ont les mêmes clés primaires, exécutez la première table a toutes, la deuxième a certaines, mais pas toutes. Quand je me joins à eux, j'obtiens un jeu d'enregistrements mais ce n'est pas complet, parce que la deuxième table ne contient pas tous les enregistrements. Existe-t-il un moyen selon moi d'écrire une logique indiquant que si la clé n'est pas dans la table # 2 pour insérer un zéro, alors l'ensemble de l'ensemble est affiché dans la vue? Je veux montrer TOUS les enregistrements dans la vue même s'il n'y a rien à joindre dedans.SQL DB Question

Mon exemple ci-dessous:

SELECT  dbo.Baan_view1b.Number, dbo.Baan_view1b.description, dbo.Baan_view1b.system, dbo.Baan_view1b.Analyst, dbo.Baan_view1b.[User], 
         dbo.Baan_view1b.[Date Submitted], dbo.Baan_view1b.category, dbo.Baan_view1b.stage, MAX(dbo.notes.percent_developed) AS Expr1 
FROM   dbo.Baan_view1b INNER JOIN 
         dbo.notes ON dbo.Baan_view1b.Number = dbo.notes.note_number 
GROUP BY dbo.Baan_view1b.Number, dbo.Baan_view1b.description, dbo.Baan_view1b.system, dbo.Baan_view1b.Analyst, dbo.Baan_view1b.[User], 
         dbo.Baan_view1b.[Date Submitted], dbo.Baan_view1b.category, dbo.Baan_view1b.stage 
HAVING  (NOT (dbo.Baan_view1b.stage LIKE 'Closed')) 

Répondre

1

Oui, vous pouvez le faire. En supposant que baan_view1b a tous les enregistrements et les notes a seulement quelques-uns, changer

FROM dbo.Baan_view1b INNER JOIN dbo.notes 

pour dire

FROM dbo.Baan_view1b LEFT OUTER JOIN dbo.notes 

INNER JOIN (ou JOIN tout simplement) indique au moteur de base de données pour prendre les enregistrements de Baan_view1b, faire correspondre avec les enregistrements dans les notes, et inclure une ligne dans la sortie pour chaque paire d'enregistrements qui correspondent. Comme vous l'avez vu, il exclut les enregistrements de Baan_view1b qui n'ont pas de correspondance dans la table des notes. LEFT OUTER JOIN indique à la place au moteur de prendre TOUS les enregistrements de Bann_view1b (parce qu'il est sur le côté gauche des mots-clés JOIN). Ensuite, il fera correspondre les enregistrements des notes partout où il le peut. Cependant, vous avez la garantie d'une ligne dans la sortie pour chaque ligne de la table de gauche, qu'elle soit compatible ou non.

Si, comme d'habitude, vous avez demandé des valeurs de colonne à partir des deux tables, les colonnes de la table sur le côté droit de JOIN auront des valeurs NULL dans les lignes manquantes.

+0

Merci de bien vouloir l'expliquer. Je l'ai fait et ça marche super! Merci les gars pour tout! – GabrielVa

5

ce que vous cherchez est la jointure gauche (gauche jointure externe) et non la jointure interne

SELECT dbo.Baan_view1b.Number, dbo.Baan_view1b.description, dbo.Baan_view1b.system, dbo.Baan_view1b.Analyst, 
     dbo.Baan_view1b.[User], dbo.Baan_view1b.[Date Submitted], dbo.Baan_view1b.category, dbo.Baan_view1b.stage, 
     MAX(dbo.notes.percent_developed) AS Expr1 
FROM dbo.Baan_view1b 
    LEFT OUTER JOIN dbo.notes 
     ON dbo.Baan_view1b.Number = dbo.notes.note_number 
WHERE NOT dbo.Baan_view1b.stage LIKE 'Closed'  
GROUP BY dbo.Baan_view1b.Number, dbo.Baan_view1b.description, dbo.Baan_view1b.system, dbo.Baan_view1b.Analyst, 
     dbo.Baan_view1b.[User], dbo.Baan_view1b.[Date Submitted], dbo.Baan_view1b.category, dbo.Baan_view1b.stage 

En outre, la modification de la clause having WHERE clause rend la requête plus efficace.

1

Remplacez inner join par left outer join.

(Ou un right outer join ou un full outer join si vous vous sentez de fantaisie.)

0

Vous avez besoin d'une jointure externe . Cela montre tous les enregistrements qui ont une clé correspondante ainsi que ceux qui n'en ont pas. La jointure interne affiche uniquement les enregistrements qui ont des clés de jointure correspondantes.

Profitez-en!

0

Vous devez faire un Left Outer Join comme d'autres affiches ont déjà mentionné. Plus d'informations peuvent être trouvées here.