oracle SQL选择一对多删除重复[duplicate]

ubof19bj  于 2023-03-07  发布在  Oracle
关注(0)|答案(1)|浏览(126)
    • 此问题在此处已有答案**:

Fetch the rows which have the Max value for a column for each distinct value of another column(35个答案)
4天前关闭。
我有一个一对多的表"A"和B(A可以有多个B)。我想从A中选择所有数据,并按B中的字段排序,但是:

select * from A a left outer join B b to b.a_id = a.id order by b.id;

它根据A与B相关项的数量返回重复项。例如,当A与3 x B相关时,我的选择中有3个重复行。
当我尝试使用distinct和order by时,我得到了一个"not expression SELECTed"异常。
我试着添加"只提取前10行",它只在我有10个以上的结果时才起作用。
到底行不行啊?我想先用sql测试一下,然后再用java写,帮帮忙吧!
我需要按B中的字段排序的A列表,且不重复。
B与A有不同的字段,假设A有ID、姓名、电话号码,B有ID、描述、标签。我想按B对A进行排序。描述(取决于用户选择)
示例:img
当我按B.描述排序时,如果3个B的描述不为空,则我有3个重复的A行。如果只有2个B的描述不为空,则我有2个重复的A行

User table:

    id     name           age
---------- -------------- -------------
         1 Robert         22
         2 Anna           14
         3 Patrick        15
         4 Ola            86

Contact table:

    id     email          phone         user_id
---------- -------------- ------------- -----------
        1  example@gmail  12312321      1
        1  dr@gmail       333331        1
        1  ajax@gmail     9971121       1
        2  ACCOUNTING     33434343      2
        2  test@test.pl   33434343      2
        3  wrongemal@w.pl 11111111      3
        4  x@x.pl         55555555      4

    SQL> select distinct user.id, user.name, user.age
      2  from User user left outer join UserContact contact on contact.user_id = user.id
      3  order by details.email;

It returns: 

    id     name           age
---------- -------------- -------------
         2 Anna           14
         2 Anna           14
         1 Robert         22
         1 Robert         22
         1 Robert         22
         3 Patrick        15
         4 Ola            86

I want to sort by email so i expect:

    id     name           age
---------- -------------- -------------
         2 Anna           14
         1 Robert         22
         3 Patrick        15
         4 Ola            86
neskvpey

neskvpey1#

我没有您的表,所以我将使用Scott的示例模式来说明它。
这是可行的,但返回重复的行:

SQL> select a.*
  2  from dept a left outer join emp b on b.deptno = a.deptno
  3  order by b.deptno;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        10 ACCOUNTING     NEW YORK
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

15 rows selected.

如果对其应用DISTINCT,Oracle将引发错误(ORA-01791:不是SELECTed表达式)。看到指向错误位置的星号了吗?它是b.表别名。该查询有什么问题?它选择了distinct a.*,但按b.列对数据进行排序,这在SELECT列列表中不是,因为它只包含a.表中的列:

SQL> select distinct a.*
  2  from dept a left outer join emp b on b.deptno = a.deptno
  3  order by b.deptno;
order by b.deptno
         *
ERROR at line 3:
ORA-01791: not a SELECTed expression

好的,然后切换到order by a.deptno,它工作了(并返回不同的数据集):

SQL> select distinct a.*
  2  from dept a left outer join emp b on b.deptno = a.deptno
  3  order by a.deptno;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL>

相关问题