2010-02-08 4 views
1

Voici un exemple de l'ensemble de données avec lequel je travaille. Je suis en train d'écrire une requête qui me permettra de demander une ligne de la table des éléments, et afficher le nom d'utilisateur de la table des utilisateurs à la place de l'utilisateur ids:SQL Server JOIN - affichage de deux valeurs jointes dans une requête mappée à une autre table?

Table 1 - users table 

User ID | User Name 
-------------------- 
12  | Fred 
13  | Ted 
14  | Ned 

Table 2 - items Table 

Item ID | Submitted User | Assigned User 
---------------------------------------- 
234  | 12    | 14 
345  | 12    | 13 
456  | 14    | 12 

Ceci est aussi loin que possible obtenir, que l'on retourne le nom d'utilisateur correctement labled:

SELECT users.[user name] AS [Submitted User] FROM items 
JOIN users ON items.[Assigned User] = users.[User ID] 
WHERE items.[Item ID] = '234' 

le problème est que si on travaille sur le terrain, je dois obtenir à la fois l'utilisateur soumis et l'utilisateur affecté. J'essaie de le faire en une seule requête ... J'ai le sentiment que cela peut être fait mais je ne sais pas exactement comment. Si j'essaie d'assigner les champs plus d'une fois, j'obtiens une erreur à propos de la corrélation. Voici un exemple de ce que j'essayé donne une erreur de corrélation:

SELECT users.[user name] AS [Submitted User], users.[user name] AS [Assigned User] FROM items 
JOIN users ON items.[Submitted User] = users.[User ID] 
JOIN users ON items.[Assigned User] = users.[User ID] 
WHERE items.[Item ID] = '234' 

C'est exactement ce que je suis en train de faire:

SELECT 
    items[Submitted User].users.[user name] AS [Reported User], 
    items[Assigned User].users.[user name] AS [Assigned User] 
WHERE items.[Item ID] = '234'</pre> 

Ceci est la réponse que je suis en train de faire:

Submitted User | Assigned user 
Fred   - Ted 

Répondre

6

Vous souhaitez aliaser votre table JOIN pour pouvoir y adhérer deux fois. Voir ci-dessous:

SELECT 
    submitted.[user name] AS [Submitted User], 
    assigned.[user name] AS [Assigned User] 
FROM items 
    LEFT JOIN users submitted ON items.[Submitted User] = submitted.[User ID] 
    LEFT JOIN users assigned ON items.[Assigned User] = assigned.[User ID] 
WHERE items.[Item ID] = '234' 

Quelques autres suggestions:

  • Tableau 2 de noms de colonne doivent être soumis ID utilisateur, Affecté ID utilisateur pour le rendre plus explicite que vous vous joignez à ID.
  • Vous pouvez créer vos champs d'ID INT. Cela permet des jointures plus rapides et moins d'espace.
  • N'oubliez pas de créer des index sur les champs ID des deux tables afin que JOIN puisse en tirer parti.
  • Merci Astander, a changé à rejoindre LEFT JOIN puisque vous voulez probablement voir les résultats
+0

Cest bien. +1 pour les bonnes suggestions X-) –

+0

Fonctionne très bien, merci beaucoup! Il m'a fallu quelques tentatives pour convertir ceci en tables et valeurs de base de données ... mais après cela je pense avoir une meilleure idée de ce que ça fait. Merci encore! – DirtyBirdNJ

Questions connexes