我在面试中问了一个问题,即不使用order by子句而不使用像php那样的脚本来排序结果。我足够google它,但没有找到方法。有没有方法以这种方式对结果进行排序。它应该不使用像php等任何脚本。
答案 0 :(得分:16)
你不能,至少不可靠。
某些SQL 实现可能会按主键或聚簇索引的顺序返回行,但SQL本身是一个关系代数,它返回任意有序的集合,除非另有特别说明。
返回行的顺序很可能很大程度上取决于创建表格后的插入和删除活动。
我对这样的采访问题的回答是:
是否有某种原因导致我们无法使用'在我们的查询?公司难以赚钱,他们无法承受磁盘空间来为每个查询存储额外的几个字节吗?你是不是在你该死的心灵?问我一个与之相关的问题: - )
答案 1 :(得分:3)
我希望他们钓鱼,看看你是否知道大多数SQL实现一般不保证返回行的顺序,除非你明确使用order by子句。
答案 2 :(得分:2)
创建表
USE [Test]
GO
/****** Object: Table [dbo].[Test_order] Script Date: 06/05/2013 10:21:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Test_order](
[TID] [int] IDENTITY(1,1) NOT NULL,
[RID] [int] NULL,
[Name] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
然后插入行
insert into dbo.Test_order values(1,'Test1')
insert into dbo.Test_order values(3,'Test3')
insert into dbo.Test_order values(2,'Test2')
insert into dbo.Test_order values(5,'Test5')
insert into dbo.Test_order values(6,'Test6')
insert into dbo.Test_order values(4,'Test4')
insert into dbo.Test_order values(9,'Test9')
insert into dbo.Test_order values(7,'Test7')
insert into dbo.Test_order values(8,'Test8')
此查询将按照RID
对数据进行排序select distinct b.TID,b.RID,b.[Name]
from dbo.Test_order as a,dbo.Test_order as b
where a.RID>=b.RID