1

私はこのようないくつかのIDで構成されるテーブルを持っています

SELECT * FROM Objects;

ObjectId
---------
    1
    4
    5

たとえば、ObjectIdごとに別のテーブルを生成する関数

SELECT * FROM dbo.GetNumbers(1)        SELECT * FROM dbo.GetNumbers(4)       SELECT * FROM dbo.GetNumbers(5) 

NumberId                               NumberId                              NumberId
---------                              ---------                             ---------
    40                                     11                                    12
    45                                     2                                    
                                           18       

カーソルを使用せずに関数によって生成されたテーブルを使用して、元のテーブルのデカルト積を取得するにはどうすればよいですか?

    SELECT ???

    ObjectId    NumberId
    ---------------------
        1           40
        1           45
        4           11
        4           2
        4           18
        5           12
4

2 に答える 2

2

これで判断するdbo.と、SQL Serverである可能性があります。その場合、外部適用が役立つ可能性があります。

select objects.ObjectID,
       numbers.NumberID
  from objects
 outer apply 
 (
   SELECT * 
     FROM dbo.GetNumbers(objects.objectid)
 ) numbers
于 2012-08-30T08:09:23.140 に答える
2

やりたいだけじゃないの?

SELECT
              o.ObjectId
            , n.NumberId
   FROM
            Objects o
       CROSS APPLY
            dbo.GetNumbers(o.ObjectId) n

結果Objectsがないものを含める場合は、を使用します。GetNumbersOUTER APPLY

それを見る簡単な方法は、 TVFCROSS APPLYに対するものでありINNER JOINTVFに対するものです。OUTER APPLYLEFT OUTER JOIN

これらを関数とは関係がなく、2セットのデカルト積CROSS JOINを提供するために使用されるものと混同しないでください。これはここで必要なものではありません。

于 2012-08-30T08:17:18.957 に答える