我在输入中有 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/