排序第一个表的数据后,从另一个表插入表

时间:2016-06-05 04:44:13

标签: sql-server tsql

我在SP做这样的事情, insert into @FilteredTbl select * from @MasterTbl

但现在的问题是,我希望在添加到@MasterTbl之前对@FilteredTbl的数据进行排序,

我该怎么做?

我发现了这个问题,答案是:

INSERT INTO @FilteredTbl 
SELECT * 
FROM @MasterTbl AS tbl
ORDER BY tbl.OrderbyColumn

但是这段代码没有用,感谢任何形式的帮助

这是测试的代码:

declare @table1 table 
(
    a1 int , 
    b1 varchar(20)
) 

insert into @table1 values 
(1,'maza') , (2,'sari') , (3,'ahvaz') , (4,'rasht')

declare @table2 table 
(
    a2 int ,
    b2 varchar(20)
) 

insert into @table2 
select * 
from @table1 t1 
order by t1.b1

select * 
from @table2

我应该看到列b2被排序,但它不是

3 个答案:

答案 0 :(得分:2)

正如我在评论中写的那样 - 关系数据库中的表格本质上是未分类的 这意味着您的测试不正确 - 因为您的select语句没有($util.base64Decode()) 子句,它基本上以任意顺序返回行。

正确的测试将在order by中包含一个标识列,该列将记录插入此表中的记录的顺序:

@table2

结果:

declare @table1 table 
(
    a1 int , 
    b1 varchar(20)
) 

insert into @table1 values 
(1,'maza') , (2,'sari') , (3,'ahvaz') , (4,'rasht')

declare @table2 table 
(
    a2 int ,
    b2 varchar(20),
    c2 int identity(1,1)
) 

insert into @table2 
select * 
from @table1 t1 
order by t1.b1

select * 
from @table2
order by c2 

如果a2 b2 c2 ----------- -------------------- ----------- 3 ahvaz 1 1 maza 2 4 rasht 3 2 sari 4 声明中的order by子句为insert into...select,则t1.a1a2的值将相同。

答案 1 :(得分:1)

在T-SQL中,需要向表中添加标识列以对其进行排序。这里的问题是您以某种特定顺序插入数据,而不是在SELECT中以特定顺序检索数据。我在查询的末尾添加了一行,可以解决这个问题:ORDER BY B1(即B1或其他一些列)。您还可以使用像ROW_NUMBER这样的函数来更快地执行诸如动态模拟标识列之类的操作,而无需在存储端实际拥有一个。在存在标识列的情况下执行INSERT确实意味着您可以按照插入的顺序返回结果 - 但如果B1中存在重复项,那么这并不意味着什么,因为INSERT中的ORDER BY会也是未定义的。在没有指定查询的情况下,标识列会有所帮助,因为没有它,表将被视为堆,没有正确的ORDER BY的SELECT可能会返回从一个查询到下一个查询的不同,不可预测的订单的结果。但是,如果检索查询中的ORDER BY子句足够具体,那么标识列就变得无关紧要了。例如,如果B1中存在欺骗但是B1和A1的每个组合都是唯一的,那么像ORDER BY B1,A1这样的子句就足以保证定义良好的顺序,一个不会无法预测地从一个查询变为下一个。然而,在你提供的4个值的情况下,这是一个没有实际意义的点,因为它们对于B1和A1都是唯一的; ORDER BY B1应该在这里完成工作。我希望有所帮助。

declare @table1 table 
(
    a1 int , 
    b1 varchar(20)
) 

insert into @table1 values 
(1,'maza') , (2,'sari') , (3,'ahvaz') , (4,'rasht')

declare @table2 table 
(
    a2 int ,
    b2 varchar(20)
) 

insert into @table2 
select * 
from @table1 t1 
order by t1.b1

select * 
from @table2
ORDER BY B1

答案 2 :(得分:0)

如果没有排序,选择没有保证订单?

select * from @ table2没有排序

如果你想要那么选择排序然后简单

select * from @table2 order by b2

你把它们放入的顺序不影响它们出来的顺序