SQL соединяет две таблицы - PullRequest
0 голосов
/ 09 марта 2011

У меня есть 2 таблицы сотрудников (идентификатор и имя) и зарплата (идентификатор, зарплата), 1-й имеет 4 строки, а 2-й имеет 2 строки.

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

Я хочу объединение следующим образом

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

Ответы [ 4 ]

7 голосов
/ 10 марта 2011

Чтобы получить все строки из T1 при присоединении к таблице T2, в которой отсутствуют строки 2 и 4, необходимо использовать левое внешнее объединение .Для строк 2 и 4 зарплата будет нулевой.

Чтобы заменить нулевое значение чем-то другим, вы можете использовать coalesce .Coalesce возвращает первый ненулевой аргумент.

Так как поле salary объявлено как поле int, и вы хотите No Salary в качестве вывода, где нет зарплаты, вам нужно cast int до varchar, прежде чем использовать его в качестве аргумента в coalesce.

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  

Результат

id          name       salary
----------- ---------- ----------
1           Sue        10000
2           Sarah      No Salary
3           Nick       9000
4           james      No Salary
2 голосов
/ 09 марта 2011
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
0 голосов
/ 09 марта 2011

Ваша цель - перечислить всех сотрудников, независимо от того, есть ли у них перечисленная зарплата, поэтому вам следует использовать LEFT JOIN. Внутреннее объединение может потенциально перечислять зарплаты для сотрудников, у которых больше нет списка в таблице Employee, и в неявном объединении (я полагаю) будут отсутствующие строки.

Что-то вроде этого должно делать то, что вам нужно:

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

0 голосов
/ 09 марта 2011

Это должно сработать.

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

edit:

если данные зарплаты имеют нулевые переменные, вместо этого попробуйте LEFT JOIN

...