我的代码适用于以下查询:
CREATE TABLE employee ( employee_id INTEGER, manager_id INTEGER, first_name VARCHAR2(10) NOT NULL, last_name VARCHAR2(10) NOT NULL, title VARCHAR2(20), salary NUMBER(6, 0) );
CREATE TABLE manager( manager_id INTEGER NOT NULL, manager_dept VARCHAR2(20) NOT NULL, first_name VARCHAR2(30) NOT NULL, last_name VARCHAR2(30) NOT NULL ) Here are my tables
SELECT
DISTINCT E.EMPLOYEE_ID, M.MANAGER_ID, E.FIRST_NAME,
E.LAST_NAME, CONNECT_BY_ISLEAF, CONNECT_BY_ISCYCLE, level
FROM EMPLOYEE E
LEFT OUTER JOIN MANAGER M
ON E.MANAGER_ID=M.MANAGER_ID
WHERE m.manager_id=10
start with e.employee_id >0
connect by NOCYCLE m.manager_id=prior e.employee_id
GROUP BY
E.EMPLOYEE_ID, M.MANAGER_ID, E.FIRST_NAME,
E.LAST_NAME, CONNECT_BY_ISLEAF, CONNECT_BY_ISCYCLE,LEVEL
但我希望我的结果集仅在employee_id而不是所有字段
上进行分组当我在下面使用此查询时,错误会生成“NOT A GROUP BY EXPRESSION”
SELECT
DISTINCT E.EMPLOYEE_ID, M.MANAGER_ID, E.FIRST_NAME,
E.LAST_NAME, CONNECT_BY_ISLEAF, CONNECT_BY_ISCYCLE, level
FROM EMPLOYEE E
LEFT OUTER JOIN MANAGER M
ON E.MANAGER_ID=M.MANAGER_ID
WHERE m.manager_id=10
start with e.employee_id >0
connect by NOCYCLE m.manager_id=prior e.employee_id
GROUP BY
E.EMPLOYEE_ID
这个查询有什么问题?
答案 0 :(得分:1)
我认为您的员工ID是唯一的,因此通过分组,您也可以按查询中的其他内容进行分组。但Oracle不知道这一点。如果您只按员工ID分组,并且您有两个具有相同ID的员工,一个姓氏为“Smith”,另一个姓氏为“Miller”,您希望看到哪一个?这是史密斯或米勒,因为你只有一行数据,因此数据库不知道该怎么做。
这就是为什么你总是必须按每个未聚合的列进行分组(使用SUM,MAX,MIN或其他一个函数)。
您可以省略结果集和group by中的列,然后将整个查询放入子查询中,外部查询选择子查询和employee表的连接中的其余列。但请相信我,你真的不想这样做,因为那个版本比你当前的查询更难以阅读和理解。