如何在使用多个连接的情况下保留密钥?
How to preserve key where multiple joins are used?
在下面的代码中,我创建了一个视图 table,用于显示员工相关数据。对于每个员工,我需要从员工那里获取所有专栏,以及从 "department" table 获取 "dept_title" 和从 "unit" table 获取 "unit_title"。基本上我已经 LEFT JOINED "staff" table 与 INNER JOINING "unit" table 和 "unit_staff" staff table("unit_staff" 的结果是单元和员工之间的连接 table)。连接这三个 table 的结果与 "department" table 左连接。所以现在我在同一视图中拥有来自三个不同 table 的所有不同列。
( staff-----left join-----> ( unit-----内连接----->unit_staff ) ) -----左加入----->部门
CREATE OR REPLACE FORCE VIEW "V_STAFF" (
"STAFF_ID",
"STAFF_NAME",
"SALUTATION",
"GENDER",
"CONTACT_NO",
"PRIMARY_EMAIL",
"SECONDARY_EMAIL",
"DOB", "ADDRESS",
"NATIONALITY",
"STAFF_TYPE",
"DEPT_NAME",
"UNITS_NAME"
) AS
SELECT staff.staff_id,
staff.staff_name,
staff.salutation,
staff.gender,
staff.contact_no,
staff.primary_email,
staff.secondary_email,
staff.dob,
staff.address,
staff.nationality,
staff.staff_type,
department.dept_title,
LISTAGG(unit_title, ',') WITHIN GROUP (ORDER BY unit_title) AS units
FROM (staff
LEFT JOIN (unit_staff INNER JOIN unit ON unit_staff.unit_id = unit.unit_id)
ON staff.staff_id = unit_staff.staff_id) LEFT JOIN department ON staff.dept_id = department.dept_id
GROUP BY staff.staff_id,
staff.staff_name,
staff.salutation,
staff.gender,
staff.contact_no,
staff.primary_email,
staff.secondary_email,
staff.dob,
staff.address,
staff.nationality,
staff.staff_type,
department.dept_title;
/
问题是键没有保留在视图中。之前,我没有在视图中包含 "department" table 并且在插入数据时我在密钥保存方面没有问题。所以我认为添加具有一对一关系的 "department" table 不会破坏密钥保存,但确实如此。我认为问题在于我对不同列进行分组的方式。我如何更改以上代码以保留密钥?
我认为删除聚合并使用子查询可以解决问题:
select s.*,
(select listagg(u.unit_title, ',') WITHIN GROUP (ORDER BY unit_title) AS units
from unit_staff us join
unit u
on us.unit_id = u.unit_id
where s.staff_id = us.staff_id)
) as units,
(select d.dept_title
from department d
where s.dept_id = d.dept_id
) as dept_tital
from staff s;
在下面的代码中,我创建了一个视图 table,用于显示员工相关数据。对于每个员工,我需要从员工那里获取所有专栏,以及从 "department" table 获取 "dept_title" 和从 "unit" table 获取 "unit_title"。基本上我已经 LEFT JOINED "staff" table 与 INNER JOINING "unit" table 和 "unit_staff" staff table("unit_staff" 的结果是单元和员工之间的连接 table)。连接这三个 table 的结果与 "department" table 左连接。所以现在我在同一视图中拥有来自三个不同 table 的所有不同列。
( staff-----left join-----> ( unit-----内连接----->unit_staff ) ) -----左加入----->部门
CREATE OR REPLACE FORCE VIEW "V_STAFF" (
"STAFF_ID",
"STAFF_NAME",
"SALUTATION",
"GENDER",
"CONTACT_NO",
"PRIMARY_EMAIL",
"SECONDARY_EMAIL",
"DOB", "ADDRESS",
"NATIONALITY",
"STAFF_TYPE",
"DEPT_NAME",
"UNITS_NAME"
) AS
SELECT staff.staff_id,
staff.staff_name,
staff.salutation,
staff.gender,
staff.contact_no,
staff.primary_email,
staff.secondary_email,
staff.dob,
staff.address,
staff.nationality,
staff.staff_type,
department.dept_title,
LISTAGG(unit_title, ',') WITHIN GROUP (ORDER BY unit_title) AS units
FROM (staff
LEFT JOIN (unit_staff INNER JOIN unit ON unit_staff.unit_id = unit.unit_id)
ON staff.staff_id = unit_staff.staff_id) LEFT JOIN department ON staff.dept_id = department.dept_id
GROUP BY staff.staff_id,
staff.staff_name,
staff.salutation,
staff.gender,
staff.contact_no,
staff.primary_email,
staff.secondary_email,
staff.dob,
staff.address,
staff.nationality,
staff.staff_type,
department.dept_title;
/
问题是键没有保留在视图中。之前,我没有在视图中包含 "department" table 并且在插入数据时我在密钥保存方面没有问题。所以我认为添加具有一对一关系的 "department" table 不会破坏密钥保存,但确实如此。我认为问题在于我对不同列进行分组的方式。我如何更改以上代码以保留密钥?
我认为删除聚合并使用子查询可以解决问题:
select s.*,
(select listagg(u.unit_title, ',') WITHIN GROUP (ORDER BY unit_title) AS units
from unit_staff us join
unit u
on us.unit_id = u.unit_id
where s.staff_id = us.staff_id)
) as units,
(select d.dept_title
from department d
where s.dept_id = d.dept_id
) as dept_tital
from staff s;