SELECT STAFF.StaffID,
STAFF.Name,
BRANCH.Name,
COUNT(RENTAL.StaffID),
COUNT(MEMBER_REGISTRATION.StaffID)
FROM STAFF
LEFT OUTER JOIN RENTAL
ON STAFF.StaffID = RENTAL.StaffID
LEFT OUTER JOIN MEMBER_REGISTRATION
ON STAFF.StaffID = MEMBER_REGISTRATION.StaffID
INNER JOIN BRANCH
ON STAFF.BranchID = BRANCH.BranchID
GROUP BY STAFF.STaffID;
不是表达群体?我有一个类似的查询没有连接工作正常。
答案 0 :(得分:2)
您可以使用相关子查询重写查询:
Oracle 11g R2架构设置:
CREATE TABLE STAFF ( StaffID NUMBER, Name VARCHAR2(50), BranchID NUMBER );
CREATE TABLE BRANCH ( BranchID NUMBER, Name VARCHAR2(50) );
CREATE TABLE RENTAL ( StaffID NUMBER );
CREATE TABLE MEMBER_REGISTRATION ( StaffID NUMBER );
INSERT INTO STAFF VALUES ( 1, 'Alice', 1 );
INSERT INTO STAFF VALUES ( 2, 'Bob', 2 );
INSERT INTO STAFF VALUES ( 3, 'Carol', 1 );
INSERT INTO STAFF VALUES ( 4, 'Dave', 2 );
INSERT INTO BRANCH VALUES ( 1, 'Branch A' );
INSERT INTO BRANCH VALUES ( 2, 'Branch B' );
INSERT INTO RENTAL VALUES ( 1 );
INSERT INTO RENTAL VALUES ( 1 );
INSERT INTO RENTAL VALUES ( 1 );
INSERT INTO RENTAL VALUES ( 1 );
INSERT INTO RENTAL VALUES ( 2 );
INSERT INTO RENTAL VALUES ( 2 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 1 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 1 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 1 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 3 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 3 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 3 );
查询1 :
SELECT s.StaffID,
s.Name,
b.Name AS branch_name,
( SELECT COUNT(r.StaffID)
FROM RENTAL r
WHERE r.StaffID = s.StaffID ) AS rental_count,
( SELECT COUNT(m.StaffID)
FROM MEMBER_REGISTRATION m
WHERE m.StaffID = s.StaffID ) AS member_regestration_count
FROM STAFF s
INNER JOIN BRANCH b
ON s.BranchID = b.BranchID
<强> Results 强>:
| STAFFID | NAME | BRANCH_NAME | RENTAL_COUNT | MEMBER_REGESTRATION_COUNT |
|---------|-------|-------------|--------------|---------------------------|
| 1 | Alice | Branch A | 4 | 3 |
| 2 | Bob | Branch B | 2 | 0 |
| 3 | Carol | Branch A | 0 | 3 |
| 4 | Dave | Branch B | 0 | 0 |
编辑1:删除了COALESCE(),因为没有必要。
编辑2:为BRANCH.name添加了列别名,因为有两列名为“name”。
答案 1 :(得分:0)
只需在group by
中添加额外的未聚合列:
SELECT STAFF.StaffID,
STAFF.Name,
BRANCH.Name,
COUNT(RENTAL.StaffID),
COUNT(MEMBER_REGISTRATION.StaffID)
FROM STAFF
LEFT OUTER JOIN RENTAL
ON STAFF.StaffID = RENTAL.StaffID
LEFT OUTER JOIN MEMBER_REGISTRATION
ON STAFF.StaffID = MEMBER_REGISTRATION.StaffID
INNER JOIN BRANCH
ON STAFF.BranchID = BRANCH.BranchID
GROUP BY STAFF.STaffID, STAFF.NAME, BRANCH.NAME;
但请注意,此查询可能无法执行您想要的操作,因为您将在rental
和member_registration
记录之间获得笛卡尔积。你可能想要:
SELECT s.StaffID, s.Name, b.Name, r.NumRentals, mr.NumRegis
FROM STAFF s LEFT OUTER JOIN
(select StaffId, count(*) as NumRentals
from RENTAL
group by StaffId
) r
ON s.StaffID = r.StaffID left outer join
(select StaffId, count(*) as NumRegis
from MEMBER_REGISTRATION
group by StaffId
) mr
ON s.StaffId = mr.StaffID LEFT OUTER JOIN
BRANCH b
ON s.BranchID = b.BranchID;
请注意,这不需要在外部查询上进行聚合。