如何在sql中加入时保持顺序

问题描述 投票:9回答:7

表1和表2的主键(key1,key2)是相同的。表3是用户定义的表,其中一个列field5对于table2是通用的。我需要从表1和表2中选择行,其中table2中的field5在table3中。我需要以与table3相同的顺序获取行。

表格1

key1 key2 field1 field2

表2

key1 key2 field3 field4 field5

用户定义的表

字段5

我正在考虑的问题是

select a.key1, a.key2, a.field1, a.field2, b.field3, b.field4
from table1 as a INNER JOIN table2 as b ON a.key1 = b.key1 AND a.key2 = b.key2
where b.field5 in (select field5 from table3)

这不会给我行与表3中相同的顺序。

我需要这样的东西来维持秩序吗?

select a.key1, a.key2, a.field1, a.field2, d.field3, d.field4 from
table1 as a INNER JOIN
 (select b.key1, b.key2, b.field3, b.field4
  from table2 as b INNER JOIN table3 as c
  ON b.field5 = c.field5) as d
WHERE a.key1 = d.key1 AND a.key2 = d.key2
sql sql-server
7个回答
9
投票

订单仅在使用order by条款时在最终结果中提供。

如果你想“按照与table3相同的顺序”,你必须编写一个合适的order by子句来重新创建table3中的顺序。

如果连接速度更快,则可以自由地对行进行加扰。


2
投票

如果您想订购输出数据,因为它是在表3中订购(插入)的,我建议,在table3 rowid int identity(1,1)中添加一列。这将创建一个自动增量字段,该字段将为插入的每个新行增加其值。

然后,您可以选择插入到该表中的行作为选择order by table3.rowid

Reference from MSDN - IDENTITY (Property)


1
投票

您不能依赖表中行的物理排序。要确保给定订单,请在表3中添加排序字段,并将查询更改为

select 
  a.key1, 
  a.key2, 
  a.field1, 
  a.field2, 
  b.field3, 
  b.field4 
from table1 as a 
INNER JOIN table2 as b ON a.key1 = b.key1 AND a.key2 = b.key2 
INNER JOIN table3 as c on b.field5 = c.field5
ORDER BY c.sort_field

1
投票

您需要添加ORDER BY子句。

SELECT a.key1, a.key2, a.field1, a.field2, d.field3, d.field4 
FROM table1 as a INNER JOIN (select b.key1, b.key2, b.field3, b.field4 from table2 as b 
INNER JOIN table3 as c ON b.field5 = c.field5) as d 
WHERE a.key1 = d.key1 AND a.key2 = d.key2
ORDER BY c.field5;

编辑:

我误解了你原来的意图。我的解决方案对field5的“值”进行了排序,这可能不是它们在表中列出的顺序。你不能依赖表中行的物理排序,我担心你想要做的事情不是你应该依赖的东西。原因是,我认为你不能保证订单将匹配“与table3相同的订单”,如果你的物理订单是什么,除非该表聚集在field5上。

例如,如果表是在field1上聚集的,并且您使用标识或“排序”列进行排序,就像其他人建议的那样,我希望标识/排序列上的排序与行中的行的物理顺序大不相同。表。我无论如何都不是SQL Server专家,但许多数据库也允许行移动,这可能会改变行的物理存储“顺序”,而不会更改排序列中的值,从而再次违反规则。

我不确定为什么你需要这些严格的订单返回。如果可能的话,我将消除该约束并允许通过对列的值进行排序来处理/处理数据,无论它是field5还是其他字段。


0
投票

尝试一下:

select a.key1, a.key2, a.field1, a.field2, b.field3, b.field4
from table1 as a 
    JOIN table2 as b ON a.key1 = b.key1 AND a.key2 = b.key2
    join (select field5, ROW_NUMBER() over (order by (select null)) Table3_Order from table3) c on b.field5 c.field5
order by c.Table3_Order

qazxsw poi是表3中的原始(我认为,物理)顺序。


0
投票

我自己也遇到了同样的问题,想出了另一个解决方案 - 你可以用你需要的任何列创建一个临时表(从field5开始)。首先将table3中的所有“field5”值插入临时表将锁定您想要的顺序(与表3中的顺序相同)。然后你可以通过加入field5等来更新你的临时表列的其余部分。这样的事情:

Table3_Order

0
投票

我有这个问题,我在Oracle中使用ROWNUM解决了这个问题:

create table #tempTable(field5 varchar(200), key1 int, key2 int, field1 varchar(200), field2 varchar(200), field3 varchar(200), field4 varchar(200))
--insert field5 values (in order) into temp table's first column
insert into #tempTable
select field5,null,null,null,null,null,null from table3
--update all other columns in the temp table as needed by joining on field5 etc.
update temp
set key1 = b.key1,
    key2 = b.key2,
    field3 = b.field3,
    field4 = b.field4
from #tempTable temp
join table2 b on b.field5 = temp.field5
--add the final fields from table1 in the same way...
update temp
set field1 = a.field1,
    field2 = a.field2
from #tempTable temp
join table1 a on a.key1 = temp.key1
© www.soinside.com 2019 - 2024. All rights reserved.