sql - SQL 显示每个类
问题描述
有人可以帮我处理我的 Oracle SQL 连接吗,有些东西不见了。下面的选择语句列出了每个学生和上课日期,但我想显示每个学生的每个班级,即使学生是否参加了课程。Kim,Brandy 和 Trina,Brandy 应该列出每个班级名称,没有上课日期,因为他们还没有上课。格林,罗伯特上过 3 节课,没有上过 2 节课,这 2 节课也应该列出,没有上课日期,因为他没有上过。列出了插入语句和创建表。如果您有任何问题,请告诉我。谢谢
SELECT VW.STUDENT_NAME,
VW.EMPLE_NO,
CN.PK_CLASS_NAME_ID,
CN.CLASS_NAME,
DP.CLASS_DATE
FROM EMPLOYEE_NAME VW
LEFT JOIN DEMO_PRODUCT_INFO_NEW DP ON DP.FK_CO_EMPL_ID = VW.EMPLE_NO
LEFT JOIN TBL_CLASS_NAME_NEW CN
ON CN.PK_CLASS_NAME_ID = DP.FK_CLASS_NAME_ID
ORDER BY STUDENT_NAME ASC;
CREATE TABLE TBL_CLASS_NAME_NEW
(
PK_CLASS_NAME_ID INTEGER,
CLASS_NAME VARCHAR2(75 BYTE)
);
Insert into TBL_CLASS_NAME_NEW
(PK_CLASS_NAME_ID, CLASS_NAME)
Values
(1, 'CPR');
Insert into TBL_CLASS_NAME_NEW
(PK_CLASS_NAME_ID, CLASS_NAME)
Values
(3, 'ETHICS');
Insert into TBL_CLASS_NAME_NEW
(PK_CLASS_NAME_ID, CLASS_NAME)
Values
(4, 'HARRASEMENT');
Insert into TBL_CLASS_NAME_NEW
(PK_CLASS_NAME_ID, CLASS_NAME)
Values
(5, 'DEFENSIVE TEST');
Insert into TBL_CLASS_NAME_NEW
(PK_CLASS_NAME_ID, CLASS_NAME)
Values
(2, 'RANGE');
COMMIT;
CREATE TABLE DEMO_PRODUCT_INFO_NEW
(
PRODUCT_ID NUMBER NOT NULL,
FK_CO_EMPL_ID NUMBER,
FK_CLASS_NAME_ID NUMBER,
CLASS_DATE DATE
);
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(4, 4, 1, TO_DATE('7/18/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(22, 4, 1, TO_DATE('7/25/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(18, 4, 4, TO_DATE('7/18/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(21, 4, 3, TO_DATE('7/4/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(32, 22, 2, TO_DATE('8/15/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(34, 22, 1, TO_DATE('8/29/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(35, 22, 1, TO_DATE('7/4/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(46, 18, 4, TO_DATE('7/4/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(43, 18, 5, TO_DATE('7/11/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(45, 4, 2, TO_DATE('7/4/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(48, 4, 5, TO_DATE('7/11/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(51, 22, 3, TO_DATE('7/4/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(52, 18, 3, TO_DATE('7/18/2021', 'MM/DD/YYYY'));
Insert into DEMO_PRODUCT_INFO_NEW
(PRODUCT_ID, FK_CO_EMPL_ID, FK_CLASS_NAME_ID, CLASS_DATE)
Values
(5, 4, 2, TO_DATE('7/25/2021', 'MM/DD/YYYY'));
COMMIT;
CREATE TABLE EMPLOYEE_NAME
(
EMPLE_NO INTEGER,
STUDENT_NAME VARCHAR2 (100 BYTE),
LAST_NAME VARCHAR2 (40 BYTE),
FIRST_NAME VARCHAR2 (40 BYTE)
);
Insert into EMPLOYEE_NAME
(EMPLE_NO, STUDENT_NAME, LAST_NAME, FIRST_NAME)
Values
(4, 'WENDY, FRANK', 'FRANK', 'WENDY');
Insert into EMPLOYEE_NAME
(EMPLE_NO, STUDENT_NAME, LAST_NAME, FIRST_NAME)
Values
(22, 'JOHN, JAMES', 'JAMES', 'JOHN');
Insert into EMPLOYEE_NAME
(EMPLE_NO, STUDENT_NAME, LAST_NAME, FIRST_NAME)
Values
(18, 'GREEN, ROBERT', 'ROBERT', 'GREEN');
Insert into EMPLOYEE_NAME
(EMPLE_NO, STUDENT_NAME, LAST_NAME, FIRST_NAME)
Values
(21, 'KIM, BRANDY', 'BRANDY', 'KIM');
Insert into EMPLOYEE_NAME
(EMPLE_NO, STUDENT_NAME, LAST_NAME, FIRST_NAME)
Values
(32, 'TRINA, JAMIE', 'JAMIE', 'TRINA');
解决方案
这就是以下查询的工作方式
T1:列出学生可以选择的所有课程和学生。
T2:列出学生选择的所有课程和学生
然后T1
去T2
LEFT JOIN与相等数量PK_CLASS_NAME_ID
和EMPLE_NO
SELECT
T1.STUDENT_NAME,
T1.EMPLE_NO,
T1.PK_CLASS_NAME_ID,
T1.CLASS_NAME,
T2.CLASS_DATE
FROM
(
SELECT VW.STUDENT_NAME,
VW.EMPLE_NO,
CN.PK_CLASS_NAME_ID,
CN.CLASS_NAME
FROM TBL_CLASS_NAME_NEW CN
JOIN EMPLOYEE_NAME VW
ON 1=1
GROUP BY VW.STUDENT_NAME,VW.EMPLE_NO, CN.PK_CLASS_NAME_ID, CN.CLASS_NAME
) T1
LEFT JOIN
(
SELECT VW.STUDENT_NAME,
VW.EMPLE_NO,
CN.PK_CLASS_NAME_ID,
CN.CLASS_NAME,
DP.CLASS_DATE
FROM TBL_CLASS_NAME_NEW CN
JOIN DEMO_PRODUCT_INFO_NEW DP
ON CN.PK_CLASS_NAME_ID = DP.FK_CLASS_NAME_ID
JOIN EMPLOYEE_NAME VW
ON DP.FK_CO_EMPL_ID = VW.EMPLE_NO
GROUP BY VW.STUDENT_NAME,VW.EMPLE_NO,CN.PK_CLASS_NAME_ID, CN.CLASS_NAME,DP.CLASS_DATE
) T2 ON T1.EMPLE_NO = T2.EMPLE_NO ANd T1.PK_CLASS_NAME_ID = T2.PK_CLASS_NAME_ID
我在 SQL 中得到了输出,但没关系,它在 Oracle 中工作。
推荐阅读
- html - 在 Chrome Mobile 上导入 font-awesome 导致 x 轴溢出
- reporting-services - SSRS:百分比目标
- r - 从绘图对象中删除悬停信息文本
- linux - OpenModelica:没有输出变量或解决方案文件
- chart.js - chart.js 如何在 0/360 度不连续处绘制 xy 图
- c++ - C++:std::map、查找循环、算法
- javascript - 允许用户在 JavaScript 中更改背景颜色
- c - 使用结构来确定平面中的点 - C
- android - 带有圆角背景颜色的 Cardview
- sql - SQL 问题:在任何给定小时内出现的次数大于 N