为表的每个值加入一个包含函数结果的表

时间:2012-08-30 07:58:50

标签: sql sql-server

我有一个由几个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

2 个答案:

答案 0 :(得分:2)

根据dbo.判断这可能是Sql Server,在这种情况下outer apply可能会有所帮助:

select objects.ObjectID,
       numbers.NumberID
  from objects
 outer apply 
 (
   SELECT * 
     FROM dbo.GetNumbers(objects.objectid)
 ) numbers

答案 1 :(得分:2)

你不想只想do吗?

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

如果您想要包含Objects结果,请GetNumbers结果使用OUTER APPLY

一种简单的方法是,CROSS APPLYINNER JOINTVFOUTER APPLYLEFT OUTER JOINTVF }。

你不应该将这些与CROSS JOIN混淆,因为Cartesian Product与函数没有任何关系,并且用于提供两组的{{3}},这不是你想要的。