Chr*_*ski 4 sql sql-server join function
我有类似这两个表(但实际上有数百万行):
items:
| X | Y |
---------
| 1 | 2 |
| 3 | 4 |
---------
details:
| X | A | B |
-------------
| 1 | a | b |
| 1 | c | d |
| 3 | e | f |
| 3 | g | h |
-------------
Run Code Online (Sandbox Code Playgroud)
我必须将一个表的几行聚合details
为另一个表中的一行items
,以便在 GridView 中显示它们,如下所示:
| items.X | items.Y | details.A | details.B |
---------------------------------------------
| 1 | 2 | a, c | b, d |
| 3 | 4 | e, g | f, h |
---------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我已经阅读了这篇文章和相关问题,并且我了解GROUP_CONCAT,但我不允许将其安装在客户系统上。因为我没有机会在本地执行此操作,所以我创建了一个存储函数(允许我创建),它返回一个包含列X
、A
和 的表B
。到目前为止,这个函数运行良好,但我似乎没有将这些列添加到我的结果集中。
目前,我正在尝试将函数结果与 上的查询连接起来items
,连接标准将是X
上面示例中的 -column 。我用 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]
Run Code Online (Sandbox Code Playgroud)
两行注释行表明,我在现实中尝试做什么,但如果没有注释,它们会隐藏我得到的实际错误:
Event 4104, Level 16, Status 1, Line 6
The multi-part identifier 'e.BusinessEntityID' could not be bound.
Run Code Online (Sandbox Code Playgroud)
据我所知,在加入过程中还没有任何价值e.[BusinessEntityID]
。因此,我无法使用函数参数来选择函数中的特定子集,无论如何,这应该在连接标准中。此外,我无法让该函数返回所有行或创建临时表,因为在我的具体情况下,这在时间和空间方面都非常缓慢且昂贵。
是否有另一种方法可以使用 2 个现有表和一个表函数来实现类似的功能?
使用申请
交叉应用类似于内连接,外连接类似于左连接
SELECT
[EmailAddress]
-- , p.[FirstName]
-- , p.[LastName]
FROM
[Person].[EmailAddress] e
cross apply
dbo.ufnGetContactInformation(e.[BusinessEntityID]) p
Run Code Online (Sandbox Code Playgroud)