SQL Server“连接”是否一致地保留任何类型的行顺序(即左表的行顺序或右表的行顺序)?
伪代码:
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 中的每一个都可能对应于零个或多个用户帐户(因为每个人都可以拥有多个帐户)。
为了从用户表中快速选择列,我用人员 ID 填充了一个临时表,然后将它与用户表内部连接。
我正在寻找一种有效的方法来确保连接中结果的顺序与 ID 插入临时表时的顺序相匹配,以便返回的用户列表与人员列表的顺序相同因为它被输入。
我考虑了以下替代方案:
我目前正在使用选项 3,它有效......但我讨厌对已经订购的东西使用 order by 子句的想法。我只是不知道临时表是否保留了插入行的顺序或连接的操作方式以及结果出现的顺序。
编辑:
假设我选择选项 3,所以有一个字段可以订购……是否有任何形式的连接可以帮助 SQL Server 在维护订单方面做最少的工作。我的意思是,它是否足够聪明,例如,查看 order by 子句中的表字段并在进行连接时首先处理该表,以便结果集的顺序大致或完全与该表的顺序一致,只是如果它已经在所需的顺序?
最佳答案
除非您使用 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>;
请注意,虽然您可以按顺序插入,但这并不意味着后续的选择将被排序,因为 除非您使用
order by
明确地对 SQL 集进行排序,否则永远不会对它们进行排序。条款。 你写:
To quickly select columns from the users table, I populate a temp table with person ids, then inner join it with the users table.
请注意,在大多数情况下,直接从
users
中选择会更快。 , 使用 in 列表:select * form users where users.id in (1, 2, 3, 6, 9, ... );
您可能过早地“优化”了不需要优化的东西。 RDBMSes(通常)被编写为高效的,并且可能不会做一些额外的工作来对已经偶然排序的东西进行排序。专注于功能,直到您证明需要优化。 (我这么说是因为过去几个月几乎只在非常大(约 50 亿行 OLTP)数据集上优化 SQL 的人,因为大多数时候,这是真的。)
关于sql-server-2008 - 内部与另一个表连接时如何保留临时表行的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2870531/