select distinct employee_id, first_name, commission_pct, department_id from
employees;
当我使用上面的查询时,它会导致所提到的所有属性的不同组合。由于employee_id(作为员工的主键)是唯一的,因此查询会生成表中的所有行。
我想拥有一个具有不同的commission_pct和department_id组合的结果集。那么应该如何形成查询。当我尝试将DISTINCT
包含在中间时
select employee_id, first_name, distinct commission_pct, department_id from
employees;
导致错误
ORA-00936-missing expression
如何形成一个查询结果只有委员会和department_id的明确组合。该表来自oracle的HR
模式。
答案 0 :(得分:2)
你要求的是不可能的。您无法选择所有员工ID,但只能使用不同的commission_pct和department_id。
所以想一想,你想表现出什么:
第一个可以用DISTINCT解决。 GROUP BY的第二个和第三个(加上count或listagg)。最后一个将使用分析函数LAG解决。
答案 1 :(得分:1)
您必须在不同的
之前删除两列select distinct commission_pct, department_id from
employees;
事实上,如果您的第二个查询有效,您希望在前两列中看到什么?考虑示例数据
| employee_id | first_name | commission_pct | department_id |
| 1 | "x" | "b" | 3 |
| 2 | "y" | "b" | 3 |
| 1 | "x" | "c" | 4 |
| 2 | "y" | "c" | 4 |
您希望只获得两行结果
| employee_id | first_name | commission_pct | department_id |
| ? | ? | "b" | 3 |
| ? | ? | "c" | 4 |
但是你对前两栏的期望是什么?
答案 2 :(得分:0)
你能尝试一下这个吗?
SELECT
NAME1,
PH
FROM
(WITH T
AS (SELECT
'mark' NAME1,
'1234567' PH
FROM
DUAL
UNION ALL
SELECT
'bailey',
'456789'
FROM
DUAL
UNION ALL
SELECT
'mark',
'987654'
FROM
DUAL)
SELECT
NAME1,
PH,
ROW_NUMBER ( ) OVER (PARTITION BY NAME1 ORDER BY NAME1) SEQ
FROM
T)
WHERE
SEQ = 1;
如果您不关心特定行,请使用聚合函数
SELECT
NAME1,
MAX ( PH ) PH
FROM
T
GROUP BY
NAME1;