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



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

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的正确订单,而得到了错误的订单?

如果不使用ORDER BY子句,则无法保证返回行的顺序,并且依赖SQL Server对行进行排序会带来灾难。

如果不使用OrderBy子句,可能会影响返回行的顺序的一件事是在表上定义的索引。

但同样不能保证,如果Order很重要,您应该始终在select语句中使用Order by子句。

尝试对其执行一个函数:

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

然后射杀你的数据库架构师。

您也许可以使用子查询。

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       |    ''    |    ''    |    ''   

最新更新