MS SQL Server顺序取决于select语句中的字段

时间:2014-08-26 18:25:43

标签: sql-server

我们有一个旧系统,它会拆分长串文本并将它们存储在一个表中,如下所示:

The compu
ter is no
t working

以及每行的其他一些数据。

我从表格中选择一些数据如下:

select a.Field1, a.Field2, a.Field3
from TableA a

很好地得到了:

Field1      Field2      Field3
The compu       2          3
ter is no       2          3
t working       2          3

但是,如果我在select语句中添加一个特定列Field4,那么订单就会被搞砸:

select a.Field1, a.Field2, a.Field3, a.Field4
from TableA a

Field1      Field2      Field3      Field4
ter is no       2          3          1
The compu       2          3          1
t working       2          3          1

如果我在select语句中使用星号,它可以正常工作:

select *
from TableA a

Field1      Field2      Field3      Field4     Field5
ter is no       2          3          1           5
The compu       2          3          1           5
t working       2          3          1           5

所以,我不能真正使用任何order by语句,因为没有什么可以订购的。

有人可以提出任何建议,说明为什么我在查询中没有Field4的情况下获得正确的订单以及错误的顺序吗?

3 个答案:

答案 0 :(得分:3)

如果您不使用ORDER BY子句,则无法保证返回行的顺序,并且根据SQL Server为您排序行是一种灾难。

不使用Order By子句可能影响返回行的顺序的一件事是在表上定义的索引。

但同样没有保证,如果订单很重要,你应该总是在你的select语句中使用Order by子句。

答案 1 :(得分:1)

尝试对其执行功能:

select a.Field1, a.Field2, a.Field3, isnull(a.Field4,'') AS [Field4]
from TableA a

然后拍摄你的数据库架构师。

答案 2 :(得分:0)

您可能可以使用子查询。

select result.field1
        , result.field2
        , result.field3
        , a.field4
    from (
            select a.id
                    , a.field1
                    , a.field2
                    , a.field3
                from TableA a
        ) result
        join TableA a
            on  a.id = result.id

否则,请确保您有一个Id列,可以通过该列来订购结果。

TableA
-----------------------------------------------
 Id  |  field1 |  field2  |  field3  |  field4
-----------------------------------------------

甚至是一个符合您目的的排序顺序列。

TableA
-------------------------------------------------------
 field1  |  field2  |  field3  |  field4  |  sortOrder
-------------------------------------------------------
 This st |    ''    |    ''    |    ''    |    1
-------------------------------------------------------
 really  |    ''    |    ''    |    ''    |    3
-------------------------------------------------------
 g       |    ''    |    ''    |    ''    |    5
-------------------------------------------------------
 ring is |    ''    |    ''    |    ''    |    2
-------------------------------------------------------
 too lon |    ''    |    ''    |    ''    |    4

您可以按照之前的说明订购。

select a.field1
        , a.field2
        , a.field3
        , a.field4
    from TableA a
    order by sortOrder asc

输出:

 field1  |  field2  |  field3  |  field4  
-----------------------------------------
 This st |    ''    |    ''    |    ''    
-----------------------------------------
 ring is |    ''    |    ''    |    ''   
-----------------------------------------
 really  |    ''    |    ''    |    ''   
-----------------------------------------
 too lon |    ''    |    ''    |    ''   
-----------------------------------------
 g       |    ''    |    ''    |    ''