如何连接此 query/relation(SQL 服务器)中的所有事件 (1..N)?
How can I concatenate all the occurrences (1..N) in this query/relation (SQL Server)?
我有这个查询:
SELECT R.Unit, LU.ReportName, R.Generated, E.EmailAddr, R.BeginDate, R.EndDate
FROM ReportsGenHistory R
JOIN ReportsLU LU ON R.ReportID = LU.ReportID
JOIN ReportsUnitEmails E ON R.Unit = E.Unit AND R.ReportID = E.ReportID;
...对于这些表:
CREATE TABLE ReportsGenHistory
(
ID int IDENTITY(1,1) PRIMARY KEY,
Unit VarChar(25) NOT NULL,
ReportID int NOT NULL,
BeginDate DateTime NOT NULL,
EndDate DateTime NOT NULL,
Generated DateTime NOT NULL,
GeneratedBy varchar(50),
);
// Lookup table
CREATE TABLE ReportsLU
(
ReportID INT NOT NULL PRIMARY KEY,
ReportID int NOT NULL
);
// 1..N table (a report can be emailed to N people)
CREATE TABLE ReportsUnitEmails
(
Unit VarChar(25) NOT NULL,
ReportID int NOT NULL,
EmailAddr VarChar(64) NOT NULL,
Created DateTime,
CreatedBy varchar(50),
CONSTRAINT pk_ReportsUnitEmailsCombinedKey PRIMARY KEY (Unit, ReportID, EmailAddr)
);
问题是,如所写,查询将(我认为)只是 return 来自 ReportsUnitEmails 的一个匹配的 EmailAddr,即使可能有更多。我想做的是将所有匹配的 EmailAddr 值连接到一个计算字段中,以便查询的结果集可能包含如下记录:
R.Unit LU.ReportName R.Generated
------ ------------- -----------
Big Red Price Compliance 2/28/2016
Big Blue Produce Usage 2/29/2016
Green Delivery Perf. 3/2/2016
E.EmailAddr R.BeginDate R.EndDate
----------- ----------- ---------
bclayshannon@gmail.com 1/14/2016 1/21/2016
cshannon@fbi.gov;joesmith@att.net;nobody@home.com 1/1/2015 1/31/2016
axx3andspace@att.net;bo@pres.org 1/1/2015 1/1/2016
我该如何调整我的 SQL 以便将电子邮件地址折叠、旋转和分割成一个逗号分隔的字段?
一种方法是使用 FOR XML PATH
将电子邮件地址连接成一个字符串:
SELECT
R.Unit,
LU.ReportName,
R.Generated,
STUFF((SELECT ','+EmailAddr FROM ReportsUnitEmails E WHERE R.Unit = E.Unit AND R.ReportID = E.ReportID FOR XML PATH('')),1,1,'') AS EmailAddr,
R.BeginDate,
R.EndDate
FROM ReportsGenHistory R
JOIN ReportsLU LU ON R.ReportID = LU.ReportID;
我有这个查询:
SELECT R.Unit, LU.ReportName, R.Generated, E.EmailAddr, R.BeginDate, R.EndDate
FROM ReportsGenHistory R
JOIN ReportsLU LU ON R.ReportID = LU.ReportID
JOIN ReportsUnitEmails E ON R.Unit = E.Unit AND R.ReportID = E.ReportID;
...对于这些表:
CREATE TABLE ReportsGenHistory
(
ID int IDENTITY(1,1) PRIMARY KEY,
Unit VarChar(25) NOT NULL,
ReportID int NOT NULL,
BeginDate DateTime NOT NULL,
EndDate DateTime NOT NULL,
Generated DateTime NOT NULL,
GeneratedBy varchar(50),
);
// Lookup table
CREATE TABLE ReportsLU
(
ReportID INT NOT NULL PRIMARY KEY,
ReportID int NOT NULL
);
// 1..N table (a report can be emailed to N people)
CREATE TABLE ReportsUnitEmails
(
Unit VarChar(25) NOT NULL,
ReportID int NOT NULL,
EmailAddr VarChar(64) NOT NULL,
Created DateTime,
CreatedBy varchar(50),
CONSTRAINT pk_ReportsUnitEmailsCombinedKey PRIMARY KEY (Unit, ReportID, EmailAddr)
);
问题是,如所写,查询将(我认为)只是 return 来自 ReportsUnitEmails 的一个匹配的 EmailAddr,即使可能有更多。我想做的是将所有匹配的 EmailAddr 值连接到一个计算字段中,以便查询的结果集可能包含如下记录:
R.Unit LU.ReportName R.Generated
------ ------------- -----------
Big Red Price Compliance 2/28/2016
Big Blue Produce Usage 2/29/2016
Green Delivery Perf. 3/2/2016
E.EmailAddr R.BeginDate R.EndDate
----------- ----------- ---------
bclayshannon@gmail.com 1/14/2016 1/21/2016
cshannon@fbi.gov;joesmith@att.net;nobody@home.com 1/1/2015 1/31/2016
axx3andspace@att.net;bo@pres.org 1/1/2015 1/1/2016
我该如何调整我的 SQL 以便将电子邮件地址折叠、旋转和分割成一个逗号分隔的字段?
一种方法是使用 FOR XML PATH
将电子邮件地址连接成一个字符串:
SELECT
R.Unit,
LU.ReportName,
R.Generated,
STUFF((SELECT ','+EmailAddr FROM ReportsUnitEmails E WHERE R.Unit = E.Unit AND R.ReportID = E.ReportID FOR XML PATH('')),1,1,'') AS EmailAddr,
R.BeginDate,
R.EndDate
FROM ReportsGenHistory R
JOIN ReportsLU LU ON R.ReportID = LU.ReportID;