- 此问题在此处已有答案**:
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
1条答案
按热度按时间neskvpey1#
我没有您的表,所以我将使用Scott的示例模式来说明它。
这是可行的,但返回重复的行:
如果对其应用
DISTINCT
,Oracle将引发错误(ORA-01791:不是SELECTed表达式)。看到指向错误位置的星号了吗?它是b.
表别名。该查询有什么问题?它选择了distinct a.*
,但按b.
列对数据进行排序,这在SELECT
列列表中不是,因为它只包含a.
表中的列:好的,然后切换到
order by a.deptno
,它工作了(并返回不同的数据集):