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没有GetNumbers结果的内容,请使用OUTER APPLY.

一种简单的看待方式是,CROSS APPLYis an INNER JOINto a TVFOUTER APPLYis a LEFT OUTER JOINto a TVF

CROSS JOIN您不应该将这些与与函数无关并用于提供两组笛卡尔积的混淆,这不是您想要的。

于 2012-08-30T08:17:18.957 回答