2010-05-20 24 views
5

SQL Server“join”是否保持任何种类的行顺序(即左表或右表的顺序)?如何在内部连接到另一个表时保持临时表行的顺序?

伪代码:

create table #p (personid bigint); 
foreach (id in personid_list) 
    insert into #p (personid) values (id) 
select id from users inner join #p on users.personid = #p.id 

假设我有对应于人的条目ID列表。每个ID可能对应于零个或多个用户帐户(因为每个人可以有多个帐户)。

要快速选择users表中的列,我使用person ID填充临时表,然后使用users表将其与内部联接。

我正在寻找一种有效的方法来确保连接中结果的顺序与插入到临时表中的ID的顺序匹配,以便返回的用户列表以相同顺序作为输入的人员列表。

我已经考虑了以下方案:

  1. 使用“#P内部连接的用户”,如果左表的顺序被保存使用“#P留下用户加入其中id是不是空
  2. “,如果左连接保留顺序并且内连接不是
  3. 使用”create table(rownum int,personid bigint)“,插入一个递增行号作为临时表被填充,所以结果可以被排序由rownum在加入
  4. 使用SQL Server等效的“为了通过[表名]在DB2

我目前使用的选项3,和它的作品...但我恨这已经下令一些使用ORDER BY子句的理念可用”条款顺序。我只是不知道,如果临时表保存在该行被插入的顺序或如何参加工作和什么样的顺序结果出来

编辑:

假设我去与选项3,所以有一个字段可以命令......有没有任何形式的连接可以帮助SQL Server在维护订单时做最少的工作。我的意思是,是否足够聪明,例如,查看按顺序排列的子句中的哪些表字段,并在执行联接时首先关闭该表,以便结果集的顺序与该表的顺序大致或完全一致如果它已经在所需的顺序?

回答

3

除非您明确命令它们使用order by子句,否则SQL集绝不会被排序。

这样做:

create table #p (personid bigint); 

insert into #p (personid) values (id) 
select id from users 
ORDER BY <something like users.name>; 

select * from #p 
ORDER BY <something like users.name>; 

注意,虽然您可以为了插入,并不意味着随后的选择将责令,因为SQL集从未下令,除非你明确地与order by责令其条款。

你写:

要快速从users表中选择列,我填充一个临时表与人的ID,然后内与用户表加入。

注意,在大多数情况下,它会以更快的速度只是直接从users选择,使用列表:

select * form users where users.id in (1, 2, 3, 6, 9, ...); 

你可能过早地“优化”的东西,没有按” t需要优化。 RDBMSes(通常)被编写为高效的,并且可能会做很少额外的工作来排序已经排序的东西。专注于功能,直到你有明确的需求进行优化。 (我认为这是因为大多数时候,这是真的,因此在过去几个月中花费了近几个月的时间几乎仅对SQL进行优化。)

+0

有数千个ID参与这个操作(涉及搜索结果),所以我不能连接你提到的表单的选择字符串。而且,不存在过早优化等问题。你要么让代码运行得更快,要么你没有,而你要么懒得改进它,要么你足够聪明。我很满意用可重用的参数化插入语句填充临时表,可以缓存和重用。 – Triynko 2010-05-20 02:01:12

+0

另一件事是... ID插入时(按人的名称组件排序)有一个OR序列,但是这样的序列与数字ID无关,因此它们不是SQL Server显而易见的顺序,所以它不能用“小额外工作”来排序(它必须再次与人员表连接并重新排序名称组件)。我仍然认为使用rownum列和排序的第三种选择是保持看似任意顺序(至少从SQL Server的角度来看)的最佳方法。 – Triynko 2010-05-20 02:14:37

+0

另一件事......使用循环来填充临时表而不是一个巨大的查询字符串的决定更多的是为了正确性而不是性能(即使简单的缓存查询执行得最好并且一个一个地插入数据流),因为与单个字符串有一个风险,即如果设置足够大,命令文本或批处理会达到一些限制(例如,65536 *包大小(4096字节)?),但是我可以发出的次数没有实际的限制在删除它之前在临时表上插入语句。 – Triynko 2010-05-20 02:24:16

相关问题