Условные JOIN разные таблицы
Я хочу знать, есть ли у пользователя запись в любой из 2 связанных таблиц.
Таблицы
USER (user_id)
EMPLOYEE (id, user_id)
STUDENT (id, user_id)
Пользователь может иметь запись о сотруднике и/или студенте. Как я могу получить эту информацию в одном запросе?
Я пробовал:
select * from [user] u
inner join employee e
on e.user_id = case when e.user_id is not NULL
then u.user_id
else null
end
inner join student s
on s.user_id = case when s.user_id is not NULL
then u.user_id
else null
end
Но он вернет только пользователей с записями в таблицах.
Ответы
Ответ 1
Вы можете использовать внешнее соединение:
select *
from USER u
left outer join EMPLOYEE e ON u.user_id = e.user_id
left outer join STUDENT s ON u.user_id = s.user_id
where s.user_id is not null or e.user_id is not null
альтернативно (если вас не интересуют данные из таблицы EMPLOYEE или STUDENT)
select *
from USER u
where exists (select 1 from EMPLOYEE e where e.user_id = u.user_id)
or exists (select 1 from STUDENT s where s.user_id = u.user_id)
Ответ 2
Если вы хотите собрать все данные пользователя, вы можете:
SELECT
user_id
,'Employee' AS Source
FROM
employee
UNION
SELECT
user_id
,'Student' AS Source
FROM
student
http://sqlfiddle.com/#!3/90216/22
Что также можно сделать с полным объединением и оператором CASE:
SELECT
ISNULL(e.user_id,s.user_id) AS user_id
,CASE WHEN e.user_id IS NULL THEN 'Student'
ELSE 'Employee'
END AS SOURCE
FROM
employee AS e
FULL JOIN student AS s
ON s.user_id = e.user_id
http://sqlfiddle.com/#!3/90216/29
последний объединяет людей, которые одновременно учатся, и служащих в одну строку, и называет их и сотрудников. Для сравнения:
http://sqlfiddle.com/#!3/2aa3e/1
а также
http://sqlfiddle.com/#!3/2aa3e/2
где я сделал пользователя 1 учеником и сотрудником
Ответ 3
Такое решение также может помочь вам.
SELECT S.*, P.*
,CASE
WHEN S.ShipmentType = 'import' THEN SP.SupplierName
WHEN S.ShipmentType = 'export' THEN C.CustomerName
END AS ShipmentDesination
FROM tblShippments S
INNER JOIN tblProducts P ON S.productId = P.productID
LEFT OUTER JOIN tblCustomers C ON S.companyId = C.customerId AND S.ShipmentType = 'export'
LEFT OUTER JOIN tblSuppliers SP ON S.companyId = SP.supplierId AND S.ShipmentType = 'import'
Ответ 4
Если вы посмотрите на таблицы сотрудников и учеников как один, вы можете использовать левое соединение:
select *
from user u
left join
(
select 'Employee' as UserType,
id,
user_id
from employee e
union all
select 'Student',
id,
user_id
from student s
) r
ON u.user_id = r.user_id
Ответ 5
Как насчет UNION, который вы пишете как два отдельных оператора SELECT
Например:
SELECT * FROM User U
JOIN Employee E ON E.User_Id = U.User_Id
UNION
SELECT * FROM User U
JOIN student S ON S.User_Id = U.User_Id
Я не мог понять, почему вам нужен оператор CASE, который выглядел излишним. Если вы хотите всех пользователей и показывать нули, используйте LEFT OUTER JOIN.