有条件加入 table
join table on condition
我有 3 个表 user
、student_data
、teacher_data
。用户可以是学生或教师。如果是老师我想加入user
和teacher_data
。如果是学生,那么我想加入 user
和 student_data
。
我怎样才能加入这个条件。
也许可以尝试联合 - 像这样
select user_id, user_other_stuff
from user, student_data
where user.user_id = student_data.user_id
UNION
select user_id, user_other_stuff
from user, teacher_data
where user.user_id = teacher_data.user_id
你可以这样写:
select u.user_id,
s.student_id,
t.teacher_id
from usr u
left join student_data s on u.user_id=s.student_id
left join teacher_data t on u.user_id=t.teacher_id
where s.student_id is not null or t.teacher_id is not null
order by u.user_id
对于每个 user_id 检查他是学生还是老师,如果他是学生,则获取他的学生列值,否则为空,如果他是教师,则获取他的教师列值,否则为空。
我会将两个数据 table 合并到一个 sub-query 中,然后将用户加入其中。
SELECT
*
FROM
usr u
LEFT JOIN
(
SELECT user_id, datum, xxx, NULL AS yyy FROM student_data
UNION ALL
SELECT user_id, datum, NULL, yyy FROM teacher_data
)
d
ON d.user_id = u.id
https://dbfiddle.uk/?rdbms=oracle_21&fiddle=9b801ea739d42fe50c00ef4e17eaf143
备注:
- 从两个数据table中选择的列必须匹配
- 必须跳过任何不匹配的列或用 NULL 填充
- 请不要调用 table
user
,它是保留关键字,Oracle 不允许。
我有 3 个表 user
、student_data
、teacher_data
。用户可以是学生或教师。如果是老师我想加入user
和teacher_data
。如果是学生,那么我想加入 user
和 student_data
。
我怎样才能加入这个条件。
也许可以尝试联合 - 像这样
select user_id, user_other_stuff
from user, student_data
where user.user_id = student_data.user_id
UNION
select user_id, user_other_stuff
from user, teacher_data
where user.user_id = teacher_data.user_id
你可以这样写:
select u.user_id,
s.student_id,
t.teacher_id
from usr u
left join student_data s on u.user_id=s.student_id
left join teacher_data t on u.user_id=t.teacher_id
where s.student_id is not null or t.teacher_id is not null
order by u.user_id
对于每个 user_id 检查他是学生还是老师,如果他是学生,则获取他的学生列值,否则为空,如果他是教师,则获取他的教师列值,否则为空。
我会将两个数据 table 合并到一个 sub-query 中,然后将用户加入其中。
SELECT
*
FROM
usr u
LEFT JOIN
(
SELECT user_id, datum, xxx, NULL AS yyy FROM student_data
UNION ALL
SELECT user_id, datum, NULL, yyy FROM teacher_data
)
d
ON d.user_id = u.id
https://dbfiddle.uk/?rdbms=oracle_21&fiddle=9b801ea739d42fe50c00ef4e17eaf143
备注:
- 从两个数据table中选择的列必须匹配
- 必须跳过任何不匹配的列或用 NULL 填充
- 请不要调用 table
user
,它是保留关键字,Oracle 不允许。