8

それぞれ1つの列を返す2つのテーブル関数があります。一方の関数は、もう一方の関数と同じ数の行を返すことが保証されています。

値を新しい2列のテーブルに挿入したいと思います。1つの列は最初のudfから値を受け取り、2番目の列は2番目のudfから値を受け取ります。挿入の順序は、行がudfsによって返される順序になります。

共通のキーを共有していない場合、これら2つのudfを結合するにはどうすればよいですか?ROW_NUMBER()を使用してみましたが、理解できません。

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

3 に答える 3

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の結果を2つのパケットに分割することを決定した場合です。2つが予期した順序で到着しない場合、SQLは受け取った順序でそれらを返す可能性があります。これにより、UDFが行を順番に返すという仮定が台無しになります。これは問題ではないかもしれませんが、実際のシステムで後で結果が必要になった場合は、ここで適切にプログラミングすることで、後で予期しないバグを防ぐことができます。

于 2012-04-18T21:08:43.087 に答える
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
于 2012-04-18T20:47:32.083 に答える
1

WITH ORDINALITYPostgreSQL 9.4以降では、接尾辞を使用してudfs結果の最後にINT8列を追加できます。

-- set returning function WITH ORDINALITY
SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n);
       ls        | n
-----------------+----
pg_serial       |  1
pg_twophase     |  2
postmaster.opts |  3
pg_notify       |  4

公式ドキュメント:http ://www.postgresql.org/docs/devel/static/functions-srf.html

関連するブログスポット: http://michael.otacoo.com/postgresql-2/postgres-9-4-feature-highlight-with-ordinality/

于 2016-02-10T09:43:31.467 に答える