2010-11-11 21 views
1

Je suis nouveau à sql alors s'il vous plaît ours avec moi ici. J'ai deux tables, COURS et RÉPONSES qui ont un ID utilisateur de champ commun. Je suis en train de créer une vue en grille qui affiche chaque nom de cours disponible pour les utilisateurs à partir de la table COURSES et dateTaken de la table RESPONSE. Donc, j'ai simplement écrit la requête comme:Sélection de valeurs à partir de plusieurs tables

SELECT c.*, r.* 
FROM COURSES c, RESPONSE r 
WHERE c.userID = @userID1 and r.userID = @userID1 and r.userResponse = NULL 

<SelectParameters> 
    <asp:Parameter Name="userID1" Type="Int32" /> 
</SelectParameters> 
<asp:GridView 
      ID      ="gvAvailCourses" 
      runat     ="server" 
      DataSourceID   ="sdsAvailCourses" 
      Width     ="100%" 
      DataKeyNames   ="trainingCourseID" 
      PageSize    ="10" 
      AllowPaging    ="true" 
      EnablePersistedSelection="true" 
      OnRowCommand   ="gvAvailCourses_RowCommand" 
      AutoGenerateColumns  ="false"> 


      <Columns> 

       <asp:BoundField DataField="trainingCourseID" HeaderText="Coursen ID" /> 
       <asp:ButtonField ButtonType="Link" DataTextField="CourseName" CommandName="CourseName" HeaderText="Course Name" /> 
       <asp:BoundField DataField="dateEntered" HeaderText="Last Taken" /> 

Le tableau de réponse peut ou ne peut pas avoir un dossier d'une réponse des utilisateurs, il n'y a peut-être pas d'enregistrement pour un code d'utilisateur particulier.

Dans tous les cas, je dois afficher dans ma vue de grille, tout couseName qui se trouve dans la table COURSES quelle que soit sa valeur dans la table RESPONSE. Si la table RESPONSE n'a pas d'enregistrement pour cet utilisateur, alors la vue de la grille ne s'affichera que vide ou indiquera "Pas encore pris" pour la colonne date prise. Ma requête ci-dessus n'affiche rien du tout s'il n'y a aucun enregistrement dans la table RESPONSE. S'il vous plaît aider.

Merci!

Répondre

1

Qu'est-ce que vous cherchez est un LEFT OUTER JOIN. Cela permet à la deuxième table d'être incluse dans la requête si des informations sont présentes, sinon les colonnes référencées renverront des valeurs NULL.

SELECT   c.*, r.* 
FROM COURSES c 
    LEFT JOIN  RESPONSE r 
    ON   r.userID = c.userID 
WHERE   r.userResponse = NULL 

Vérifiez les jointures internes et leurs modificateurs gauche/droite.

+0

pourquoi la clause where? –

+0

parce qu'ils avaient cela dans leur requête d'origine? Essayer de le laisser tomber aussi simplement que possible. Sans avoir les données en face de moi et en supposant qu'il avait une valeur autre qu'un filtre pour simuler la jointure, je l'ai gardé. Si ce n'est pas nécessaire, l'OP pourrait simplement l'enlever. –

+0

Merci pour la réponse rapide. Une autre chose que la table RESPONSE peut avoir des entrées en double. Je sais que je peux utiliser DISTINCT pour ça mais c'est pour toute la table. Comment utiliser distinct uniquement pour la table RESPONSE afin qu'un seul enregistrement soit sélectionné à partir de RESPONSE. – Ratan

1

Ce que vous décrivez est une jointure gauche des cours à la réponse. Donner à tous les cours, montrer la réponse associée si son là, sinon nul

SELECT c.*, r.* 
FROM COURSES c LEFT JOIN RESPONSE r 
ON c.userID = r.userID 
+0

Merci pour la réponse rapide. Une autre chose que la table RESPONSE peut avoir des entrées en double. Je sais que je peux utiliser DISTINCT pour ça mais c'est pour toute la table. Comment utiliser distinct uniquement pour la table RESPONSE afin qu'un seul enregistrement soit sélectionné à partir de RESPONSE. – Ratan