【发布时间】:2018-01-18 23:06:56
【问题描述】:
假设,我有两张桌子:
-
学生班级:
Student_ID、Class_ID -
类:
Class_ID、Attribute_ID等字段
[底部的样本数据]
要求:
- 对于给定的学生,列出具有给定属性的班级的对应值。
- 如果学生不参加具有此特定属性的课程 - 请改为列出 NULL。
- 如果保证有 NULL 的行 - 每个学生只生成一个这样的行
没有条件 #2 和 #3 是简单的INNER JOIN
SELECT sc.student_id, c.*
FROM Student_class sc
JOIN Class c ON sc.class_id=c.class_id
WHERE c.attribute_id = ... AND sc.student_id IN (...)
没有#3,它是OUTER JOIN
SELECT sc.student_id, c.*
FROM Student_class sc
LEFT JOIN Class c ON sc.class_id=c.class_id AND c.attribute_id = ...
WHERE sc.student_id IN (...)
满足所有三个要求 - 我正在苦苦挣扎。
SELECT DISTINCT sc.student_id, c.*
FROM Student_class sc
LEFT JOIN Class c ON sc.class_id=c.class_id AND c.attribute_id = ...
WHERE sc.student_id IN (...)
无论是否找到具有该属性的类,以上都会产生 NULL 行。
我正在考虑为列表中的每个学生动态创建NULL row,并使用INNER JOIN 结果创建UNION。
SELECT student_id, NULL, NULL, ... , ...
UNION
SELECT sc.student_id, c.*
FROM Student_class sc
JOIN Class c ON sc.class_id=c.class_id
WHERE c.attribute_id = ... AND sc.student_id IN (...)
上述要求在第一个查询中使用正确数量的 NULL,因此无法承受对表的更改。
我在这里遗漏了一些明显的东西吗?
样本数据:
学生班级:
Student_ID Class_ID
0001 0050
0001 0150
0002 0050
0002 0100
0002 0155
0002 1200
0002 1155
0003 1155
0004 0050
0004 0155
类:
Class_ID Attribute_ID Value1 Value2 Value3
0050 A1 1 2 3
0100 A2 4 5 6
0150 A3 7 8 9
0155 A1 9 8 7
1155 A4 6 5 4
1200 A4 3 2 1
Student ID 的期望结果:0001、0002、0003 和 Attribute_ID:A1。
Student_Id Class_ID Attribute_ID Value1 Value2 Value3
0001 050 A1 1 2 3
0002 050 A1 1 2 3
0002 155 A1 9 8 7
0003 NULL NULL NULL NULL NULL
【问题讨论】:
-
能否提供样本数据?
-
@FelixPamittan - 已添加。希望没有错别字。
标签: sql join many-to-many ansi-sql