按行号连接两个相同大小的结果集

时间:2012-04-18 20:41:36

标签: sql sql-server sql-server-2008-r2

我有两个表函数,每个函数返回一个列。保证一个函数返回与另一个函数相同的行数。

我想将值插入到新的双列表中。一个列将从第一个udf接收值,第二个列从第二个udf接收。插入的顺序将是udfs返回行的顺序。

如果他们不共享公共密钥,我如何加入这两个udfs?我尝试过使用ROW_NUMBER(),但无法弄清楚:

INSERT INTO dbo.NewTwoColumnTable (Column1, Column2)
SELECT udf1.[value], udf2.[value]
FROM dbo.udf1() udf1
INNER JOIN dbo.udf2() udf2 ON ??? = ???

3 个答案:

答案 0 :(得分:5)

这对你没有帮助,但是SQL不保证行顺序,除非明确要求它,所以他们将按照你期望的顺序返回它们的想法对于给定的集合可能是真的,但是我理解这个想法基于集合的结果,基本上不能保证正常工作。如果它与保证订单的内容相关联,您可能希望从UDF返回一个密钥。

尽管如此,您仍可以执行以下操作:

declare @val int
set @val=1;

Select Val1,Val2 from 
(select Value as Val2, ROW_NUMBER() over (order by @val) r from udf1) a
join 
(select Value as Val2, ROW_NUMBER() over (order by @val) r from udf2) b
on a.r=b.r

该变量解决了需要按列排序的问题。

如果您有编辑UDF的权限,我认为更好的做法是已经对来自UDF的数据进行排序,然后您可以将ident int identity(1,1)添加到udf中的输出表中,这使得这很清楚。

这可能很重要的原因是你的服务器决定将udf结果分成两个数据包。如果两者超出了您预期的顺序,那么SQL可以按接收的顺序返回它们,这会破坏他的UDF将按顺序返回行的假设。这可能不是问题,但如果稍后需要对真实系统进行结果,则此处的正确编程可以防止意外错误。

答案 1 :(得分:3)

SQL中,“udfs返回的顺序”不保证会持续存在(即使在调用之间)。

试试这个:

WITH    q1 AS
        (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY whatever1) rn
        FROM    udf1()
        ),
        q2 AS
        (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY whatever2) rn
        FROM    udf2()
        )
INSERT
INTO    dbo.NewTwoColumnTable (Column1, Column2)
SELECT  q1.value, q2.value
FROM    q1
JOIN    q2
ON      q2.rn = q1.rn

答案 2 :(得分:1)

PostgreSQL 9.4+可以使用FileUpload1.FileName后缀

在udfs结果的末尾附加一个INT8列
WITH ORDINALITY

官方文件:http://www.postgresql.org/docs/devel/static/functions-srf.html

相关博客点:http://michael.otacoo.com/postgresql-2/postgres-9-4-feature-highlight-with-ordinality/