Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Joining Two Same-Sized Resultsets by Row Number

I have two table functions that return a single column each. One function is guaranteed to return the same number of rows as the other.

I want to insert the values into a new two-column table. One colum will receive the value from the first udf, the second column from the second udf. The order of the inserts will be the order in which the rows are returned by the udfs.

How can I JOIN these two udfs given that they do not share a common key? I've tried using a ROW_NUMBER() but can't quite figure it out:

INSERT INTO dbo.NewTwoColumnTable (Column1, Column2)
SELECT udf1.[value], udf2.[value]
FROM dbo.udf1() udf1
INNER JOIN dbo.udf2() udf2 ON ??? = ???
like image 630
Emmanuel Avatar asked Apr 18 '12 20:04

Emmanuel


1 Answers

This will not help you, but SQL does not guarantee row order unless it is asked to explicitly, so the idea that they will be returned in the order you expect may be true for a given set, but as I understand the idea of set based results, is fundamentally not guaranteed to work properly. You probably want to have a key returned from the UDF if it is associated with something that guarantees the order.

Despite this, you can do the following:

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

The variable addresses the issue of needing a column to sort by.

If you have the privlidges to edit the UDF, I think the better practice is to already sort the data coming out of the UDF, and then you can add ident int identity(1,1) to your output table in the udf, which makes this clear.

The reaosn this might matter is if your server decided to split the udf results into two packets. If the two arrive out of the order you expected, SQL could return them in the order received, which ruins the assumption made that he UDF will return rows in order. This may not be an issue, but if the result is needed later for a real system, proper programming here prevents unexpected bugs later.

like image 125
David Manheim Avatar answered Oct 01 '22 23:10

David Manheim