【问题标题】:Select Distinct by 4 columns and return all columns in table选择 Distinct by 4 columns 并返回表中的所有列
【发布时间】:2014-11-04 14:13:40
【问题描述】:

我需要为前 4 列返回 select distinct,并返回所有其他列。例如,如果我有:

DEPTNO LOC           JOB              SAL ENAME
---------- ------------- --------- ---------- ----------
    10 NEW YORK      CLERK           1300 MILLER
    10 NEW YORK      MANAGER         2450 CLARK
    10 NEW YORK      CLERK           1300 KING
    20 DALLAS        ANALYST         3000 FORD
    20 DALLAS        ANALYST         3000 SCOTT
    20 DALLAS        CLERK            800 SMITH
    20 DALLAS        CLERK           1100 ADAMS
    20 DALLAS        MANAGER         2975 JONES
    30 CHICAGO       CLERK            950 JAMES
    30 CHICAGO       MANAGER         2850 BLAKE
    30 CHICAGO       SALESMAN        1250 MARTIN
    30 CHICAGO       SALESMAN        1250 WARD
    30 CHICAGO       SALESMAN        1500 TURNER
    30 CHICAGO       SALESMAN        1600 ALLEN

我需要返回:

 DEPTNO LOC           JOB              SAL ENAME
---------- ------------- --------- ---------- ----------
    10 NEW YORK      CLERK           1300 MILLER
    10 NEW YORK      MANAGER         1300 CLARK
    20 DALLAS        ANALYST         3000 SCOTT
    20 DALLAS        CLERK            800 SMITH
    20 DALLAS        CLERK           1100 ADAMS
    20 DALLAS        MANAGER         2975 JONES
    30 CHICAGO       CLERK            950 JAMES
    30 CHICAGO       MANAGER         2850 BLAKE
    30 CHICAGO       SALESMAN        1250 MARTIN
    30 CHICAGO       SALESMAN        1500 TURNER
    30 CHICAGO       SALESMAN        1600 ALLEN

换句话说,如果前 4 列是唯一的(一起),我将返回整行。

我尝试使用select distinct,但我只得到我在命令中写入的列:

select distinct DEPTNO,LOC,JOB,SAL from my_table

不会返回 ENAME。

我尝试使用内连接,但我从表中获取所有列。

感谢

【问题讨论】:

    标签: sql oracle select


    【解决方案1】:

    您尚未指定您希望它如何在多个 ENAME 之间进行选择。在本例中,它按字母顺序返回第一个:

    SELECT DISTINCT
           deptno
          ,loc
          ,job
          ,sal
          ,MIN(ename)
           OVER (PARTITION BY deptno, loc, job, sal)
           AS ename
    FROM my_table;
    

    【讨论】:

    • 感谢回答,ename 可以不唯一,我可以使用相同的ename 拥有更多行。
    • 嗨@Nick,对不起,我不确定你的意思。您的问题规定您只希望每个 deptno+loc+job+sal 有一行,但没有说明查询应如何选择在任何特定行上显示的 ename。
    【解决方案2】:

    你也可以试试这个方法

    Example :
    
    create table ttt
    (   
        DEPTNO  int     ,
        LOC            varchar(20),
        JOB               varchar(20),
        SAL  int,
        ENAME varchar(20)
    )
    

    --

    insert into 
    ttt
    values(10,'NEW YORK','CLERK',1300,'MILLER'),
    (10,'NEW YORK','MANAGER',2450,'CLARK'),
    (10,'NEW YORK','MANAGER',2450,'KING')
    

    --

    SELECT
      DISTINCT 
      DEPTNO,
      LOC,
      JOB,
      SAL,
      MAX(ENAME) from ttt
    GROUP BY 
      DEPTNO,
      LOC,
      JOB,
      SAL
    

    这是用于此的 SQL Fiddle

    Click To See Demo

    【讨论】:

    • @Nick 我已经创建了演示请看一下
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多