/*
今天遇到一个奇怪的问题:
直接查询时115号排第一位,103号排最后一位,可插入到固定表AA时,最后一位103却跑到第一位去了。
是什么原因啊?
详情如下:
*/--1、本身就有的固定表AA
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AA]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[AA]
GOCREATE TABLE [dbo].[AA] (
[s_no] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[s_name] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[sex] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[V_NameType] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[V_NameState] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[V_NameShift] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ID] [int] IDENTITY (1, 1) NOT NULL
) ON [PRIMARY]
GO--2、直接查询时,115号排第一位,103号排最后一位,是正常的
Select B.s_no,B.s_name,B.sex,B.V_NameType,B.V_NameState,B.V_NameShift
--,ID=Identity(int,1,1) Into AA
From SN_JiShi_PaiWei As A left outer join set_jishi as B on B.s_no=A.ID_JiShi
where A.State_JS='K' and A.AllType='1'
Order By A.No_PaiWei Asc
--3、先drop table AA
drop table AA
--4、插入到固定表AA就出问题了:115号排第二位,103号排第一位了。什么原因啊?
Select B.s_no,B.s_name,B.sex,B.V_NameType,B.V_NameState,B.V_NameShift
,Identity(int,1,1) as ID Into AA
From SN_JiShi_PaiWei As A left outer join set_jishi as B on B.s_no=A.ID_JiShi
where A.State_JS='K' and A.AllType='1'
Order By A.No_PaiWei
--5、查询定表AA
select * from AA order by id/*查询结果:
直接查询时的结果:正确115 肖静静 女 足浴技工 空闲 足浴早班-A
119 肖红花 女 足浴技工 空闲 足浴早班-A
103 孙单 女 足浴技工 空闲 足浴早班-A查询定表AA的结果:错误
103 孙单 女 足浴技工 空闲 足浴早班-A 1
115 肖静静 女 足浴技工 空闲 足浴早班-A 2
119 肖红花 女 足浴技工 空闲 足浴早班-A 3
*/
今天遇到一个奇怪的问题:
直接查询时115号排第一位,103号排最后一位,可插入到固定表AA时,最后一位103却跑到第一位去了。
是什么原因啊?
详情如下:
*/--1、本身就有的固定表AA
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AA]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[AA]
GOCREATE TABLE [dbo].[AA] (
[s_no] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[s_name] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[sex] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[V_NameType] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[V_NameState] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[V_NameShift] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ID] [int] IDENTITY (1, 1) NOT NULL
) ON [PRIMARY]
GO--2、直接查询时,115号排第一位,103号排最后一位,是正常的
Select B.s_no,B.s_name,B.sex,B.V_NameType,B.V_NameState,B.V_NameShift
--,ID=Identity(int,1,1) Into AA
From SN_JiShi_PaiWei As A left outer join set_jishi as B on B.s_no=A.ID_JiShi
where A.State_JS='K' and A.AllType='1'
Order By A.No_PaiWei Asc
--3、先drop table AA
drop table AA
--4、插入到固定表AA就出问题了:115号排第二位,103号排第一位了。什么原因啊?
Select B.s_no,B.s_name,B.sex,B.V_NameType,B.V_NameState,B.V_NameShift
,Identity(int,1,1) as ID Into AA
From SN_JiShi_PaiWei As A left outer join set_jishi as B on B.s_no=A.ID_JiShi
where A.State_JS='K' and A.AllType='1'
Order By A.No_PaiWei
--5、查询定表AA
select * from AA order by id/*查询结果:
直接查询时的结果:正确115 肖静静 女 足浴技工 空闲 足浴早班-A
119 肖红花 女 足浴技工 空闲 足浴早班-A
103 孙单 女 足浴技工 空闲 足浴早班-A查询定表AA的结果:错误
103 孙单 女 足浴技工 空闲 足浴早班-A 1
115 肖静静 女 足浴技工 空闲 足浴早班-A 2
119 肖红花 女 足浴技工 空闲 足浴早班-A 3
*/
按道理115号的ID应该为1才对啊。难道IDENTITY的顺序不是取决于最后面的order by 吗?
Select B.s_no,B.s_name,B.sex,B.V_NameType,B.V_NameState,B.V_NameShift
,Identity(int,1,1) as ID Into AA
From SN_JiShi_PaiWei As A left outer join set_jishi as B on B.s_no=A.ID_JiShi
where A.State_JS='K' and A.AllType='1'
Order By A.No_PaiWei
这句按照Order By A.No_PaiWei排序插入的。
参考一下这个,不过我以前弄的时候也有碰到过,ORDER BY 不起作用,
insert into #t1 select 'A01', 11
insert into #t1 select 'A01', 10
insert into #t1 select 'B01', 15
insert into #t1 select 'B01', 16
insert into #t1 select 'C01', 18
insert into #t1 select 'C01', 19
insert into #t1 select 'C01', 17 select identity(int,1,1) as F1,F2
into #temp1
from #t1
order by F1, f2 select identity(int,1,1) as F3,F2
into #temp2
from #t1
order by F1,f2
SELECT * FROM #T1 ORDER BY F1,F2
SELECT * FROM #temp1 ORDER BY F1,F2
SELECT * FROM #temp2 ORDER BY F3,F2
DROP TABLE #temp1,#temP2,#T1
/*
f1 f2
---------- -----------
A01 10
A01 11
B01 15
B01 16
C01 17
C01 18
C01 19(所影响的行数为 7 行)F1 F2
----------- -----------
1 11
2 10
3 15
4 16
5 18
6 19
7 17(所影响的行数为 7 行)F3 F2
----------- -----------
1 10
2 11
3 15
4 16
5 17
6 18
7 19(所影响的行数为 7 行)*/
看一下,呵呵,这样的效果
create table #t1(f1 varchar(10),f2 int)
insert into #t1 select 'A03', 11
insert into #t1 select 'A01', 10
insert into #t1 select 'B01', 15
insert into #t1 select 'B01', 16
insert into #t1 select 'C01', 18
insert into #t1 select 'C01', 19
insert into #t1 select 'C01', 17 select identity(int,1,1) as a1,F2
into #temp1
from #t1
order by f1,f2 select * from #temp1a1 F2
----------- -----------
1 10
2 11
3 15
4 16
5 17
6 18
7 19
,Identity(int,1,1) as ID Into AA
From SN_JiShi_PaiWei As A left outer join set_jishi as B on B.s_no=A.ID_JiShi
where A.State_JS='K' and A.AllType='1'
Order By A.No_PaiWei ,B.s_no
你看我這裡運行結果f1 f2
---------- -----------
A01 10
A01 11
B01 15
B01 16
C01 17
C01 18
C01 19(7 個資料列受到影響)F1 F2
----------- -----------
1 10
2 11
3 15
4 16
5 17
6 18
7 19(7 個資料列受到影響)F3 F2
----------- -----------
1 10
2 11
3 15
4 16
5 17
6 18
7 19(7 個資料列受到影響)
完全考慮你的SQL阿,,,沒有任何改動,,
但是第2個結果是不一樣啊?
我帖的上面的那个帖子里面就说版本可能有关系的,
我测试第二个不一样的,
因为IDENTIT的别名与排序前的那个名字相同为F1
下次記得發SQL版本號了,,,
這個頗Into還區分2005/2000的不同啊,,,
是2005有先進行排序,再into呢
insert into #t1 select 'A01', 11
insert into #t1 select 'A01', 10
insert into #t1 select 'B01', 15
insert into #t1 select 'B01', 16
insert into #t1 select 'C01', 18
insert into #t1 select 'C01', 19
insert into #t1 select 'C01', 17 select identity(int,1,1) as F1,F2
into #temp1
from #t1
order by F1, f2 select identity(int,1,1) as F3,F2
into #temp2
from #t1
order by F1,f2
SET SHOWPLAN_TEXT ON
StmtText
------------------------------
SET STATISTICS PROFILE ON(所影响的行数为 1 行)StmtText
---------------------------------------------------------------------------------------------------------------------------
select identity(int,1,1) as F1,F2
into #temp1
from #t1
order by F1, f2(所影响的行数为 1 行)StmtText
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|--Table Insert(OBJECT:([#temp1]), SET:([#temp1].[F2]=[#t1].[f2], [#temp1].[F1]=[Expr1003]))
|--Top(ROWCOUNT est 0)
|--Compute Scalar(DEFINE:([Expr1003]=setidentity([Expr1002], -7, 0, '#temp1')))
|--Sort(ORDER BY:([Expr1002] ASC, [#t1].[f2] ASC))
|--Compute Scalar(DEFINE:([Expr1002]=getidentity(-7, 0, '#temp1')))
|--Table Scan(OBJECT:([tempdb].[dbo].[#t1_________________________________________________________________________________________________________________000000000020]))(所影响的行数为 6 行)StmtText
-----------------------------------------------------------------------------------------------------------------------
select identity(int,1,1) as F3,F2
into #temp2
from #t1
order by F1,f2(所影响的行数为 1 行)StmtText
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|--Table Insert(OBJECT:([#temp2]), SET:([#temp2].[F2]=[#t1].[f2], [#temp2].[F3]=[Expr1003]))
|--Top(ROWCOUNT est 0)
|--Compute Scalar(DEFINE:([Expr1003]=setidentity([Expr1002], -7, 0, '#temp2')))
|--Compute Scalar(DEFINE:([Expr1002]=getidentity(-7, 0, '#temp2')))
|--Sort(ORDER BY:([#t1].[f1] ASC, [#t1].[f2] ASC))
|--Table Scan(OBJECT:([tempdb].[dbo].[#t1_________________________________________________________________________________________________________________000000000020]))(所影响的行数为 6 行)StmtText
-----------------------------
SET STATISTICS PROFILE OFF(所影响的行数为 1 行)2000的执行计划,第一个是先计算,再排序,第二个是排序,再计算
如果你的聚集索引为ID,当然插入数据后,在表中数据行是以ID为升序排列的。
如果为No_PaiWei。自然就是按照No_ParWei排序了,所以就正常了。
05的话,SQLSERVER也不保证,
用row_number吧
原因是因为
insert into #t1 select 'A01', 11
insert into #t1 select 'A01', 10
列f1 与 f2 中 f1的值相同都是 A01, 而f2中10的值小于11 ,故第二行数据排在了第一位。
http://support.microsoft.com/?scid=kb%3Ben-us%3B273586&x=2&y=14
Select B.s_no,B.s_name,B.sex,B.V_NameType,B.V_NameState,B.V_NameShift
,Identity(int,1,1) as ID Into AA
From SN_JiShi_PaiWei As A left outer join set_jishi as B on B.s_no=A.ID_JiShi
where A.State_JS='K' and A.AllType='1'
Order By A.No_PaiWei
这里的order by其实并不能保证你要的排序 微软官方文档没有明确说明这点所以不推荐大家在这个时候用order by 来确保你要的排序所以在2005 推出的row_number()可以很好解决问题