2016-09-22 19 views
3

我有(按实际价值不过几百万行)像这2个表:如何在MS SQL Server中使用表函数结果?

items: 
| X | Y | 
--------- 
| 1 | 2 | 
| 3 | 4 | 
--------- 

details: 
| X | A | B | 
------------- 
| 1 | a | b | 
| 1 | c | d | 
| 3 | e | f | 
| 3 | g | h | 
------------- 

我要聚集一个表details的几行一行在另一个表items显示他们在这样一个GridView :

| items.X | items.Y | details.A | details.B | 
--------------------------------------------- 
| 1  | 2  | a, c  | b, d  | 
| 3  | 4  | e, g  | f, h  | 
--------------------------------------------- 

我已经读过this和相关的问题,我知道GROUP_CONCAT,但我不允许客户系统上安装它。因为我没有机会在本地执行此操作,所以我创建了一个存储函数(我可以创建该函数),该函数返回一个表,其中列X,AB。此功能迄今为止工作正常,但我似乎没有将这些列添加到我的结果集。

目前我试图加入items查询的函数结果,在上面的示例中,join-criterion将是X-列。我做了一个小例子,与AdventureWorks2012数据库,其中包含一个表函数dbo.ufnGetContactInformation(@PersonID INT)[Person].[EmailAddress]台加入关于BusinessEntityID

SELECT 
    [EmailAddress] 
    -- , p.[FirstName] 
    -- , p.[LastName] 
FROM 
    [Person].[EmailAddress] e 
INNER JOIN 
    dbo.ufnGetContactInformation(e.[BusinessEntityID]) p 
    ON p.[PersonID] = e.[BusinessEntityID] 

的2注释行表示,我尝试在现实中的事,但如果没有评论,他们隐藏了实际的错误,我得到:

Event 4104, Level 16, Status 1, Line 6 
The multi-part identifier 'e.BusinessEntityID' could not be bound. 

我明白,在接合过程中存在的e.[BusinessEntityID]没有价值呢。所以我不能通过使用函数参数来选择函数中的特定子集,无论如何这应该在连接标准中。此外,我不能让该函数返回全部行或创建一个临时表,因为在我的特定情况下,这对于时间和空间来说都是非常慢和昂贵的。

是否有另一种方式来实现这样的事情,2现有的表和表函数?

回答

2

使用应用

跨应用类似于内部连接,外部应用类似于左加入

SELECT 
    [EmailAddress] 
    -- , p.[FirstName] 
    -- , p.[LastName] 
FROM 
    [Person].[EmailAddress] e 
cross apply 
    dbo.ufnGetContactInformation(e.[BusinessEntityID]) p 
+0

谢谢!这正是我正在寻找的。 –

相关问题