2012-01-18 63 views
6

我有一个表: abc_test列n_num,k_str。在列上使用distinct并在另一列上进行排序会出错

这查询不工作:

select distinct(n_num) from abc_test order by(k_str) 

但是这一个工程:

select n_num from abc_test order by(k_str) 

如何DISTINCT和ORDER BY关键字的工作都在内部查询的该输出改变?

+2

你能显示的结果,如果你运行这些两个查询?第一个查询应该返回错误“ORA-01791:不是SELECTed表达式”,因为没有选择“k_str”列。这是你运行的实际查询吗? (这可能是在9i中接受的,但我不能肯定。)SQL Server上,但有更多的描述性错误消息 – 2012-01-18 07:36:40

+0

相同的效果,“如果指定SELECT DISTINCT ORDER BY项目必须出现在选择列表中。” – onedaywhen 2012-01-18 08:56:21

回答

10

据我了解你的问题。

distinct: - 表示选择不同的(所有选定的值都应该是唯一的)。 order By: - 简单的说就是根据您的要求来订购选定的行。

在你第一次查询的问题是 例如: 我有一个表

ID name 
01 a 
02 b 
03 c 
04 d 
04 a 

现在查询select distinct(ID) from table order by (name)是混乱的,其记录应采取的ID - 04(因为两个值都在那里,d和一个名称列)。所以当你说 order by(name)时,数据库引擎的问题就在这里.........

0

您正在从查询结果集中选择集合distinct(n_num)。所以与列k_str没有实际关系了。 n_num可以来自两行,每行对于k_str具有不同的值。所以你不能通过k_str命令集合distinct(n_num)。

3

第一个查询是不可能的。我们来举例说明一下。我们有这样的测试:

n_num k_str 
2  a 
2  c 
1  b 

select distinct (n_num) from abc_test

2 
1 

Select n_num from abc_test order by k_str

2 
1 
2 

你想返回

select distinct (n_num) from abc_test order by k_str什么?

它应该只返回1和2,但如何命令它们?

+0

这个怎么样? 'select distinct(n_num)as abc_test ORDER BY iresult ASC' – 2012-01-18 08:19:12

+0

当然他可以按第一列排序。 OP是关于为什么这个查询不起作用。你说的很简单:'从abc_test order中选择不同的n_num'1' – 2012-01-18 08:22:30

+0

“如何订购它们?” - 我可以想到可能的方法:任意地;为了那么任意地排列不明确的值,等等。但是我更怀疑你是否正在提出一个迷失在我身上的观点! – onedaywhen 2012-01-18 09:06:37

4

你可能会考虑使用GROUP BY来代替:

select n_num 
from abc_test 
group by n_num 
order by min(k_str) 
+0

将无法​​正常工作。 k_str不可选。 – 2012-01-18 08:13:36

+0

@FlorinGhita你是什么意思?我只是试过查询,对我来说它看起来像是在工作。 – 2012-01-18 08:17:54

+1

heeeei,你编辑了你的问题。 'ORDER BY分钟(k_str)'是一个不同的东西'为了通过k_str' – 2012-01-18 08:20:05

-1

你尝试呢?

SELECT DISTINCT n_num as iResult 
FROM abc_test 
ORDER BY iResult 
+0

请参阅我的答案中的示例。你想返回你的查询? – 2012-01-18 08:15:46

0

根据SQL标准,一个SELECT条款可引用的条款(“别名”)的结果集的顶层SELECT条款或列的顺序位置,因此,您的查询的幽冥将兼容。

看来,Oracle与其他SQL实现一样,允许您引用在投影到SELECT子句之前立即存在的(逻辑上)列。我不确定这样的灵活性是否是一件好事:IMO通过在SELECT子句中包含列/表达式等,将排序顺序公开给调用应用程序是一种好的做法。

与以往一样,您需要申请dsicpline得到有意义的结果。对于第一个查询,订单的定义是完全可能应该arbitrary.You是错误感激;)

0

这种做法是在SQL Server 2000中可用,您可以选择不同的列一个表,以便不同的值,其不包含在Distinct中。 但在SQL 2012这将通过你的错误 “ORDER BY项目如果指定SELECT DISTINCT必须出现在选择列表中。”

所以,还是,如果你想使用两个不同的功能SQL 2000的你可以使用的列数订购(其最好的做法不推荐)。

select distinct(n_num) from abc_test order by 1 

这将命令取出结果后的第一列。如果您希望排序应该基于不同的列而不是distinct,那么您必须在select语句中添加该列,并使用列号来排序。

select distinct(n_num), k_str from abc_test order by 2 
-1

你可以做

select distinct top 10000 (n_num) --assuming you won't have more than 10,000 rows     
from abc_test order by(k_str) 
1

当我到了同样的错误,我把它解决了通过改变它作为

SELECT n_num 
FROM(
    SELECT DISTINCT(n_num) AS n_num, k_str 
    FROM abc_test 
) as tbl 
ORDER BY tbl.k_str 
相关问题