将DISTINCT用于特定列

时间:2013-12-20 10:14:49

标签: oracle distinct

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模式。

3 个答案:

答案 0 :(得分:2)

你要求的是不可能的。您无法选择所有员工ID,但只能使用不同的commission_pct和department_id。

所以想一想,你想表现出什么:

  • 所有不同的commission_pct,department_id只?
  • 所有不同的commission_pct,department_id和相关员工的数量?
  • 所有不同的commission_pct,department_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;