sql-server-2008 - 内部与另一个表连接时如何保留临时表行的顺序?

标签 sql-server-2008 join

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 插入临时表时的顺序相匹配,以便返回的用户列表与人员列表的顺序相同因为它被输入。

我考虑了以下替代方案:
  • 使用“#p 内连接用户”,以防左表的顺序被保留
  • 使用“#p left join users where id is not null”,以防左连接保留顺序而内连接不
  • 使用“创建表(rownum int,personid bigint)”,在填充临时表时插入一个递增的行号,因此结果可以按连接中的 rownum 排序
  • 使用与 DB2 中可用的“order by order of [tablename]”子句等效的 SQL Server

  • 我目前正在使用选项 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/

    相关文章:

    mysql - SQL 连接具有两种类型的元素表

    php - Laravel 连接表

    ruby-on-rails - Rails ActiveRecord 连接多个表

    sql - 合并复制数据库中的插入非常慢

    c# - 在两个 asp.net web 应用程序之间共享相同的 SessionId

    MySQL - 连接三个表并显示数据(即使没有找到匹配项)

    c++ - 为什么在 C++ 函数 boost::algorithm::join_if 中抛出 std::bad_cast 异常?

    SQL选择第一列来匹配单行中许多列的条件

    visual-studio-2008 - 如何使SSIS约束线保持整洁?

    sql-server - 将日期时间格式中的 NULL 值更改为空字符串