SQL Server 加入顺序

标签 sql sql-server sql-server-2008 join

我在输入中有 2 个字符串,例如“1,5,6”和“2,89,9”,具有相同数量的元素(3 或以上)。 我想要将这两个字符串作为“坐标连接”

1   2
5   89
6   9

我想分配一个行号并在两个结果集之间进行连接

SELECT a.item, b.item  FROM 
  (
  SELECT  
  ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS rownumber,
  *  FROM dbo.Split('1,5,6',',')
  ) AS a
  INNER JOIN   
  (
  SELECT  
  ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS rownumber,
  *  FROM dbo.Split('2,89,9',',')
 ) AS b ON a.rownumber = b.rownumber 

这是有史以来的最佳实践吗?

最佳答案

dbo.Split()返回数据集时,您所做的任何事情都无法绝对确定地分配您想要的row_number(基于它们在字符串中的顺序)。如果没有与数据实际相关的 ORDER BY,SQL 永远不会保证排序。

通过使用(SELECT 0)进行排序技巧,您可能经常获得正确的值。可能非常经常。但这是永远保证的。有时您得到错误的订单。

您最好的选择是重新编码dbo.Split()以在解析字符串时分配row_number。只有这样,您才能 100% 确定 row_number 确实对应于该项目在列表中的位置。

然后你按照你的建议加入他们,并得到你想要的结果。


除此之外,这个想法对我来说确实不错。不过,如果一个列表可能比另一个列表长,您可能希望考虑使用FULL OUTER JOIN

关于SQL Server 加入顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9737131/

相关文章:

sql - SQL Server 是否可以进行列分区

sql - 强制 MySQL 在 Join 上使用两个索引

c# - 在 Visual Studio 2012 中以管理员身份运行解决方案中的项目之一

sql - 如果表来自同一服务器不同的数据库,为什么会出现错误 'invalid object name'?

sql - 获取 SQL Server 跨数据库依赖关系

sql - SELECT 中的 MSSQL cast( [varcharColumn] to int) 在 WHERE 子句过滤掉错误值之前执行

mysql - MySQL 5.7中获取最高分数和最高分数行中的字段

sql - 如何在 Tarantool 中更改 sql 表的格式

SQL Server 2008 将 1 列拆分为 3 列(运输维度)

sql-server - 测试存储过程的最佳方法是什么?