我有两个表函数,每个函数返回一个列。保证一个函数返回与另一个函数相同的行数。
我想将值插入到新的双列表中。一个列将从第一个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 ??? = ???
答案 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
后缀
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/