我有一个表: 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关键字的工作都在内部查询的该输出改变?
我有一个表: 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关键字的工作都在内部查询的该输出改变?
据我了解你的问题。
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)时,数据库引擎的问题就在这里.........
您正在从查询结果集中选择集合distinct(n_num)。所以与列k_str没有实际关系了。 n_num可以来自两行,每行对于k_str具有不同的值。所以你不能通过k_str命令集合distinct(n_num)。
第一个查询是不可能的。我们来举例说明一下。我们有这样的测试:
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,但如何命令它们?
这个怎么样? 'select distinct(n_num)as abc_test ORDER BY iresult ASC' – 2012-01-18 08:19:12
当然他可以按第一列排序。 OP是关于为什么这个查询不起作用。你说的很简单:'从abc_test order中选择不同的n_num'1' – 2012-01-18 08:22:30
“如何订购它们?” - 我可以想到可能的方法:任意地;为了那么任意地排列不明确的值,等等。但是我更怀疑你是否正在提出一个迷失在我身上的观点! – onedaywhen 2012-01-18 09:06:37
你可能会考虑使用GROUP BY来代替:
select n_num
from abc_test
group by n_num
order by min(k_str)
将无法正常工作。 k_str不可选。 – 2012-01-18 08:13:36
@FlorinGhita你是什么意思?我只是试过查询,对我来说它看起来像是在工作。 – 2012-01-18 08:17:54
heeeei,你编辑了你的问题。 'ORDER BY分钟(k_str)'是一个不同的东西'为了通过k_str' – 2012-01-18 08:20:05
你尝试呢?
SELECT DISTINCT n_num as iResult
FROM abc_test
ORDER BY iResult
请参阅我的答案中的示例。你想返回你的查询? – 2012-01-18 08:15:46
根据SQL标准,一个SELECT
条款可引用的条款(“别名”)的结果集的顶层SELECT
条款或列的顺序位置,因此,您的查询的幽冥将兼容。
看来,Oracle与其他SQL实现一样,允许您引用在投影到SELECT
子句之前立即存在的(逻辑上)列。我不确定这样的灵活性是否是一件好事:IMO通过在SELECT
子句中包含列/表达式等,将排序顺序公开给调用应用程序是一种好的做法。
与以往一样,您需要申请dsicpline得到有意义的结果。对于第一个查询,订单的定义是完全可能应该arbitrary.You是错误感激;)
这种做法是在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
你可以做
select distinct top 10000 (n_num) --assuming you won't have more than 10,000 rows
from abc_test order by(k_str)
当我到了同样的错误,我把它解决了通过改变它作为
SELECT n_num
FROM(
SELECT DISTINCT(n_num) AS n_num, k_str
FROM abc_test
) as tbl
ORDER BY tbl.k_str
你能显示的结果,如果你运行这些两个查询?第一个查询应该返回错误“ORA-01791:不是SELECTed表达式”,因为没有选择“k_str”列。这是你运行的实际查询吗? (这可能是在9i中接受的,但我不能肯定。)SQL Server上,但有更多的描述性错误消息 – 2012-01-18 07:36:40
相同的效果,“如果指定SELECT DISTINCT ORDER BY项目必须出现在选择列表中。” – onedaywhen 2012-01-18 08:56:21