不是由表达式SQL错误组

时间:2013-12-15 21:03:26

标签: sql oracle

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; 

不是表达群体?我有一个类似的查询没有连接工作正常。

2 个答案:

答案 0 :(得分:2)

您可以使用相关子查询重写查询:

SQL Fiddle

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;

但请注意,此查询可能无法执行您想要的操作,因为您将在rentalmember_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;

请注意,这不需要在外部查询上进行聚合。