2009-08-10 6 views
1

Je rencontre des problèmes avec une question de jointure SQL.Question relative à la jointure SQL

J'ai une table EMPLOYEE avec EmpID, FirstName, LastName, Email, Phone

J'ai une autre table OTHERNAME avec 2 champs "Name" & "OtherName".

Cette table contient des valeurs de recherche telles que "James", "Jim"; "Thomas", "Tom"; "Steven", "Steve".

Je veux écrire une requête qui renvoie des lignes

EmpID, FirstName, LastName, Email, Phone, OtherName 
where Employee.Firstname = OTHERName.Name 
+0

Appellez tout le monde par leur autre nom. Qu'en est-il des gens appelés Richard ..? Le nom alternatif doit-il être lié à l'identité de l'employé au lieu du prénom? – pjp

+0

Non car OTHERNAME n'a que des données de type "recherche". Cela signifie que l'OTHERNAME n'aura qu'un seul enregistrement pour ROBERT, BOB; ou un enregistrement pour THOMAS, TOM; indépendamment s'il y a 12 Roberts dans l'entreprise. – Frank

Répondre

7
Select e.EmpID, e.FirstName, e.LastName, e.Email, e.Phone, o.OtherName 
From Employee e 
Left Outer Join OtherName o on e.FirstName = o.Name 

De vos commentaires il semble que vous voulez réellement une jointure externe. (De commentaires) Une jointure externe renverrait tous les employés, avec un autre nom s'il y en a un, sinon Autre serait une valeur nulle que vous pourriez gérer dans le code. Une jointure interne limite les résultats aux seuls employés avec un enregistrement correspondant.

+0

oui, je veux seulement retourner othername s'il y a une correspondance – Frank

+0

Ensuite, la requête d'origine devrait faire le travail. – Brandon

+0

bien, je veux retourner toutes les lignes de l'employé. S'il y a une correspondance trouvée dans OTHERName, alors retrunez cette valeur – Frank

0
SELECT E.EmpID, E.FirstName, E.LastName, E.Email, E.Phone, O.OtherName 
FROM Employee E 
    INNER JOIN Othername O 
     ON E.Firstname = O.Name 

devrait faire l'affaire

Ou, si vous voulez tous les résultats, même ceux sans valeurs « autre nom ».

SELECT E.EmpID, E.FirstName, E.LastName, E.Email, E.Phone, O.OtherName 
FROM Employee E 
    LEFT OUTER JOIN Othername O 
     ON E.Firstname = O.Name 
+0

Cela permettra de filtrer tous les employés qui n'ont pas d '"autre nom" - pas ce que l'OP voulait, je présume .... –

+0

Basé sur les commentaires des affiches, il cherche un match exact. –

0

SELECT E.EmpId, E.FirstName, E.LastName, E.Email, E.Phone, O.OtherName DE EMPLOYE E INNER JOIN otherName O ON E.FirstName = O.Name

+0

Cela permettra de filtrer tous les employés qui n'ont pas d '"autre nom" - pas ce que le PO voulait, je présume .... –

1

essayez ceci:

SELECT 
    e.EmpID 
     CASE 
      WHEN o.OtherName IS NOT NULL THEN OtherName 
      ELSE e.FirstName 
     END AS FirstName 
     ,e.LastName 
     ,e.Email 
     ,e.Phone 
     ,o.OtherName 
    FROM Employee    e 
    LEFT OUTER JOIN OtherName o ON e.FirstName = o.Name 
1
select e.EmpID, e.FirstName, e.LastName, e.Email, e.Phone, o.OtherName 
from employee e,othername o 
where e.FirstName=o.name 
+1

vous devez utiliser la syntaxe JOIN explicite et ne pas joindre les tables avec une virgule. – Taryn

0

Vous pouvez utiliser la commande SQL suivante

SELECT EMPLOYEE.EmpID, 
     EMPLOYEE.FirstName, 
     EMPLOYEE.LastName, 
     EMPLOYEE.Email, 
     EMPLOYEE.Phone, 
     OTHERNAME.OtherName FROM EMPLOYEE INNER JOIN OTHERNAME ON EMPLOYEE.FirstName = OTHERNAME.Name