我有以下查询:
SELECT
CompanyID, CompanyName,
dbo.GetCommaSeparatedOwnerNames(CompanyID),
GetCommaSeparatedOwnerEmails(CompanyID)
FROM Companies
显然,每家公司都有多个所有者。
CommaSeparatedOwnerNames
和GetCommaSeparatedOwnerEmails
函数如下所示:
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及更高版本,如果这有任何区别的话。
答案 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。