SQL Server 选择对链接表的查询,以获取一个字段中每个主键的所有相关结果(以逗号分隔的值表示

2wnc66cl  于 2022-12-28  发布在  其他
关注(0)|答案(2)|浏览(101)

我有一个有3个表的数据库:EmployeesClients和一个链接表。EmployeesClients表具有多对多关系。一个或多个员工可以与一个或多个客户端一起工作。某些员工(通常是新员工)可能不与任何客户端一起工作。
Employees表包含以下列:

Employoee_ID, Employee_FirstName, Employee_LastName

Clients表包含以下列:

Client_ID, Client_Name, Client_Address

我需要在Microsoft SQL Server上编写一个SQL查询,该查询选择Employee_IDEmployee_FirstNameEmployee_LastName,然后有一个Clients字段,该字段在一个字段中列出每个员工正在使用的所有客户端ID。
表格:
Employees
| 入职人员_ID|员工_名字|员工_姓氏|
| - ------| - ------| - ------|
| 1个|乔治|华盛顿|
| 第二章|约翰|亚当斯|
| 三个|汤姆|杰佛逊|
Clients
| 客户端ID|客户名称|客户_地址|
| - ------| - ------| - ------|
| 十一|客户端Al|艾尔路1号|
| 二十二|客户帐单|比尔路2号|
| 三十三|客户克里斯|克里斯路3号|
| 四十四|客户查理|查理街30号|
链接表
| 员工ID|客户ID|
| - ------| - ------|
| 1个|十一|
| 第二章|二十二|
| 第二章|三十三|
| 三个|四十四|
我需要一个Microsoft SQL Server查询,将返回以下输出(每个员工只列出一次,所有他/她的相关客户的ID显示在同一行,在一个字段中,作为逗号分隔/分号分隔的值):
| 入职人员_ID|员工_名字|员工_姓氏|客户|
| - ------| - ------| - ------| - ------|
| 1个|乔治|华盛顿|十一|
| 第二章|约翰|亚当斯|二十二岁;三十三岁|
| 三个|汤姆|杰佛逊|四十四|
请告知如果你知道一种方法来写一个查询,以获得上述结果。目前,我得到每个雇员多次与每个客户端ID在单独的行。
我尝试使用SELECT distinct和其他函数,但无法在每个雇员的一个字段中生成逗号分隔的客户端ID。
目前,我的查询列出了雇员"John Adams"两次,一次与其每个客户。
| 入职人员_ID|员工_名字|员工_姓氏|客户|
| - ------| - ------| - ------| - ------|
| 1个|乔治|华盛顿|十一|
| 第二章|约翰|亚当斯|二十二|
| 第二章|约翰|亚当斯|三十三|
| 三个|汤姆|杰佛逊|四十四|
尝试select (distinct) EmployeeID以使每个员工仅列出一次,但无法在一个字段中列出所有相关的clientID。

yvgpqqbh

yvgpqqbh1#

您可以使用string_agg-STRING_AGG (Transact-SQL)

select e.employee_id,
       e.employee_firstname,
       e.employee_lastname,
       string_agg(cli.clientid, ',') AS clients
  from Employees e
left join [linking table] cli
  on e.employee_id= cli.employeeid;
gzszwxb4

gzszwxb42#

自SQL Server 2017起,您可以通过group by和STRING_AGG函数获得所需的输出:

select 
  e.Employoee_ID,
  MAX(e.Employee_FirstName) as Employee_FirstName,
  MAX(e.Employee_LastName) as Employee_LastName,
  STRING_AGG(CONVERT(NVARCHAR(max),ClientID), ';') as Clients
from employoee e
join links l on e.Employoee_ID = l.EmployeeID
join client c on c.Client_ID = l.ClientID
group by e.Employoee_ID

输出:
| 入职人员_ID|员工_名字|员工_姓氏|客户|
| - ------| - ------| - ------| - ------|
| 1个|乔治|华盛顿|十一|
| 第二章|约翰|亚当斯|二十二岁;三十三岁|
| 三个|汤姆|杰佛逊|四十四|
看看演示小提琴。

相关问题