我们有一个旧系统,它可以拆分长字符串的文本,并将它们存储在一个表中,如下所示:
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 | '' | '' | ''