我有一个由几个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
答案 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 APPLY
是INNER JOIN
到TVF,OUTER APPLY
是LEFT OUTER JOIN
到TVF }。
你不应该将这些与CROSS JOIN
混淆,因为Cartesian Product与函数没有任何关系,并且用于提供两组的{{3}},这不是你想要的。