2011-03-09 5 views
-1

J'ai 2 tables employees (identifiant et nom) et salaire (id, salaire), le 1er a 4 lignes et le 2nd a 2 lignes.SQL joignant deux tables

table 1   Table 2 
id Name   id salary 
1  Sue   1 10000 
2 Sarah   3  9000 
3 Nick 
4 james 

Je veux une jointure comme suit

id Name  Salary 
1  Sue  10000 
2 Sarah No Salary 
3 Nick  9000 
4 james No salary 
+2

Alors vous avez créé un compte ici juste pour nous demander de faire vos devoirs? Dans le même temps, vous auriez pu google sur SQL JOINs et terminer la mission. – red

+0

Combien gagnez-vous avec "Bo salary"? "Bo" comme dans "Bonus", non? –

+0

Allez les gars .. Je suis débutant avec SQL donc posté une telle question .. Ne répondez pas si vous pensez que c'était trop bête .. – LearningSQL

Répondre

-2

Cela devrait faire l'affaire.

SELECT e.id, e.name , s.salary FROM employees e 
INNER JOIN salary s 
ON e.id=s.id 
ORDER BY e.id ASC 

modifier:

si les données de salaire est a des variables nulles essayer LEFT JOIN à la place

+4

Ce n'est pas le JOIN que vous cherchez ... –

+0

mis à jour, a ajouté une note. Nous ne savons pas comment la colonne "salaire" est stockée, donc .. – Arda

+4

Votre commentaire implique que vous ne comprenez pas bien ce qu'est une jointure OUTER. –

2
SELECT e.id, e.name , 
case 
when s.salary is null then 'no salary' 
else cast(s.salary as varchar) 
end 
FROM employees e LEFT JOIN salary s 
ON e.id=s.id 
order by e.id 
+1

CASE expression bonne, JOIN mauvaise ... –

+0

vous avez raison, devrait être laissé rejoindre – BlackTigerX

0

Votre but est de répertorier tous les employés, peu importe si oui ou non ils ont un salaire cotée, donc vous devriez utiliser un LEFT JOIN. Une jointure interne pourrait potentiellement lister les salaires des employés qui n'ont plus de liste dans la table Employee et une jointure implicite (je crois) serait manquante.

Quelque chose comme cela devrait faire ce que vous avez besoin:

SELECT E.id, E.name, S.salary FROM Employees E LEFT JOIN Salary S ON E.id = S.id

+0

Mais je veux «pas de salaire» dans la colonne de salaire pour les employés sans aucun salaire – LearningSQL

7

Pour obtenir toutes les lignes de T1 lors de son adhésion à la table T2 qui manque les lignes 2 et 4, vous devez utiliser un left outer join. Pour les lignes 2 et 4, le salaire sera nul. Pour remplacer la valeur nulle par autre chose, vous pouvez utiliser coalesce. Coalesce renvoie le premier argument non nul.

Depuis le terrain salary est déclarée comme un champ int et que vous voulez No Salary en sortie où il n'y a pas de salaire, vous devez cast le int à un varchar avant de l'utiliser comme un argument en soudent.

declare @T1 table(id int, name varchar(10)) 
declare @T2 table(id int, salary int) 

insert into @T1 values(1, 'Sue') 
insert into @T1 values(2, 'Sarah') 
insert into @T1 values(3, 'Nick') 
insert into @T1 values(4, 'james') 

insert into @T2 values(1, 10000) 
insert into @T2 values(3, 9000) 

select 
    T1.id, 
    T1.name, 
    coalesce(cast(T2.salary as varchar(10)), 'No Salary') as salary 
from @T1 as T1 
    left outer join @T2 as T2 
    on T1.id = T2.id 

Résultat

id   name  salary 
----------- ---------- ---------- 
1   Sue  10000 
2   Sarah  No Salary 
3   Nick  9000 
4   james  No Salary