2017-08-11 78 views
0

我有一个表中有SQL数据库中的ShipCountry,ShipCity和Freight列。我试图通过使用下面的查询从该表中检索数据。获取数据库顺序中的数据,而无需对其进行排序

Select ShipCountry from CountryDetails Group by ShipCountry 

如果我运行这个查询,我得到的结果按升序排列。而不是我需要数据库顺序的数据。如何通过SQL查询来实现这一点?

说明:如果我运行下面的查询,它将以数据库顺序返回数据。当我在查询中添加group by子句时,我获取了排序数据。

Select ShipCountry from CountryDetails 
+0

你好。你的问题有点不清楚。您能否介绍一个虚构的数据集以及您想成为查询结果的内容?谢谢 – Christos

+5

只是一个说明,没有“数据库顺序”的真正概念。这仅仅是数据库从内存/磁盘加载行的顺序。这可以随着时间的推移,在数据库重启之间发生变化等。 – wmorrell

+0

感谢您的回复。在这里,我提到的数据库顺序是数据存储或输入表中的顺序。从您的观点来看,数据库重新启动后,数据库顺序会随时间而改变。 –

回答

6

由排序是不正确的。该应用组(组通过对聚合函数为最小值,最大值或计数)

如果你需要一个特定的顺序使用order by代替

Select ShipCountry from CountryDetails Order by ShipCountry 

否则,如果要的不是订单使用简单

Select ShipCountry from CountryDetails 

记住次在db中存储的值没有正确的顺序..并且按照用于取回数据的顺序选择。

每次你需要你必须esplicitally通过

为避免“重复值”使用顺序..例如通过使用不同的,而不是集团的订单时间:

Select distinct ShipCountry from CountryDetails 
+0

谢谢。我不想点菜。我只使用下面的查询。 从CountryDetails中选择ShipCountry 如果我运行它,它将返回多余的ShipCountry值。为了避免冗余值,我在查询中添加了group by子句。 我的目标是,我不想像asc或desc这样的订单,我不想要冗余数据。 –

+2

@UmapathyS只要您意识到由于数据分布的变化,数据库顺序在任何给定时间都会发生变化。这意味着结果集的排序顺序可能会从一天变为另一天。如果这是你可以忍受的事情,通过一切手段只需使用'SELECT FROM'。 – SchmitzIT

+0

@SchmitzIT感谢您的回复。 –

0

,如果你想拥有同样的数据库顺序在大多数情况下,如果你已经按主键排序,它将是相同的没有按照你说的顺序:

这里的id是主键,如果你不能使用主键添加标识列并使用它:

ID名称

1伊丽

2艾哈迈德

3约瑟夫

4奥马尔

+0

如果只有每张桌子都有PK。在野外太多次了,一张桌子只是一堆,这要感谢非数据库精明的开发者:( – SchmitzIT

+0

欢迎(“我明白你说的是:(”),每个表只有一个PK,而身份不是PK, PK可能是一个身份,PK可能是文本,在文本的情况下,所需的命令将不可用,因此,通过添加一个新的数字标识列,可以提供想要的命令 –

2

正如已经已经指出,你所描述可能导致来回您的最终意外的结果用户。

我们假设你有一个没有任何索引或键的表(一个所谓的堆)。一堆可以比作电话簿(是的,我已经有一段时间了)由数百页组成,其中信息是随机排列的。一堆就是这样;很多随机排序的数据。无论何时从这样的表中查询,查询分析器都将尽其最大努力来确定传递数据的最快方式。

查询分析器的这种决策是由统计指导的;一组关于数据及其分布的度量标准。 SQL Server使用这些统计数据来计算基数(值的唯一性),并因此选择返回数据的最快方式。

当您只是在堆上发出SELECT * FROM myTable时,这些统计信息将决定您的数据返回的顺序。但是,这也意味着随着时间的推移,随着更多数据流入表格,统计信息将发生变化。这样做的效果是,今天数据的排序顺序不一定是明天返回数据的排序顺序,或者从现在起甚至五分钟。

如果您的最终用户无妨,那么SELECT * FROM myTable是适合您的解决方案。但是,如果您绝对需要以特定顺序返回数据,则应始终使用ORDER BY子句。

相关问题