ユーザーが2つの関連テーブルのanyにエントリを持っているかどうかを知りたい。
テーブル
USER (user_id)
EMPLOYEE (id, user_id)
STUDENT (id, user_id)
ユーザーは、従業員および/または学生のエントリを持つことができます。 1つのクエリでその情報を取得するにはどうすればよいですか?私は試した:
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
ただし、bothテーブルにエントリがあるユーザーのみを返します。
外部結合を使用できます:
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)
すべてのユーザーデータをまとめて取得する場合
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
後者は、学生であり従業員でもある人々を1行にまとめ、それらを従業員と呼びます。比較する:
http://sqlfiddle.com/#!3/2aa3e/1 および http://sqlfiddle.com/#!3/2aa3e/2
ユーザー1を学生と従業員にした場合
このような解決策も役立ちます。
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'
従業員テーブルと学生テーブルを1つとして見ると、左結合を使用できます。
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
2つの別々のSELECT文として書くUNIONはどうですか
例えば: 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ステートメントが必要なのかわかりませんでした。すべてのユーザーにnullを表示する場合は、LEFT OUTER JOINを使用します。