带有两个内部函数的SQL SELECT

时间:2014-04-05 22:30:00

标签: sql sql-server sql-server-2008

我有以下查询:

SELECT 
    CompanyID, CompanyName, 
    dbo.GetCommaSeparatedOwnerNames(CompanyID), 
    GetCommaSeparatedOwnerEmails(CompanyID) 
FROM Companies

显然,每家公司都有多个所有者。

CommaSeparatedOwnerNamesGetCommaSeparatedOwnerEmails函数如下所示:

CREATE FUNCTION [dbo].[GetCommaSeparatedOwnerNames] (@CompanyID int)  
RETURNS VARCHAR(MAX)
BEGIN 
    DECLARE @list VARCHAR(MAX)

    SELECT @list = COALESCE(@list+',' ,'') + OwnerName
    FROM Owners
    WHERE CompanyID = @CompanyID

    RETURN @list
END

CREATE FUNCTION [dbo].[GetCommaSeparatedOwnerEmails] (@CompanyID int)  
RETURNS VARCHAR(MAX)
BEGIN 
    DECLARE @list VARCHAR(MAX)

    SELECT @list = COALESCE(@list+',' ,'') + OwnerEmail
    FROM Owners
    WHERE CompanyID = @CompanyID

    RETURN @list
END

我是否可以在不浪费执行两个类似功能的情况下实现相同的查询结果?

我的目标是SQL Server 2005及更高版本,如果这有任何区别的话。

1 个答案:

答案 0 :(得分:2)

您可以使用STUFF和FOR XML使用相关子查询创建逗号分隔列表。

CREATE TABLE Companies (CompanyID INT, CompanyName VARCHAR(10))
CREATE TABLE Owners (CompanyID INT, OwnerName VARCHAR(10), OwnerEmail VARCHAR(100))

INSERT INTO Companies VALUES 
 (1,'BobCo')
,(2,'JoeCo')
INSERT INTO Owners VALUES 
 (1,'Bob_1','B1@Bob.com')
,(1,'Bob_2','B2@Bob.com')
,(2,'Joe_1','J1@Joe.com')
,(2,'Joe_2','J2@joe.com')

SELECT CompanyName 
      ,STUFF((SELECT ', ' + CAST(OwnerName AS VARCHAR(MAX))
                FROM Owners o
               WHERE o.CompanyID=c.CompanyID
                 FOR XML PATH('')
              ), 1, 2, '') OwnerNames
      ,STUFF((SELECT ', ' + CAST(OwnerEmail AS VARCHAR(MAX))
                FROM Owners o
               WHERE o.CompanyID=c.CompanyID
                 FOR XML PATH('')
              ), 1, 2, '') OwnerEmail
  FROM Companies c

fiddle