我需要在 SQL Server 中连接两个表的多行数据中分别连接两列。
例如,我有一个“关联”表和“市场”表,如下所示”
Association:
user_id | role_id | market_id
-------------------------------
1 | a | 1
1 | a | 2
2 | c | 3
2 | c | 4
2 | c | 5
Market:
market_id | market_name
-----------------------
1 | Arizona
2 | Utah
3 | Indiana
4 | Illinois
5 | Kentucky
Run Code Online (Sandbox Code Playgroud)
我需要将关联表中的 market_id 连接成每个用户 ID 的单个值,并从市场表中引入连接的市场名称,我想要的输出如下所示:
user_id | role_id | market_ids | market_names
--------------------------------------------------
1 | a | 1,2 | Arizona,Utah
2 | c | 3,4,5 | Indiana,Illinois,Kentucky
Run Code Online (Sandbox Code Playgroud)
现在,我能够成功连接市场 ID,但仍然使用以下 SQL 为每个市场获得多行数据:
SELECT DISTINCT
a.user_id,
a.role_id,
SUBSTRING(
(
SELECT DISTINCT ', ' + market_id AS [text()]
FROM Association aa
WHERE a.user_id = aa.user_id
FOR XML PATH ('')
), 2, 1000) [market_ids],
SUBSTRING(
(
SELECT DISTINCT ', ' + market_name AS [text()]
FROM Market bb
WHERE a.market_id = bb.market_id
FOR XML PATH ('')
), 2, 1000) [Market Name]
FROM
Association a
INNER JOIN
Market b
ON a.market_id = d.market_id
Run Code Online (Sandbox Code Playgroud)
关于如何实现第二个串联有什么想法吗?
具有 Row_Number() 的 CTE 来保持呈现顺序应该可以解决问题
例子
;with cte as (
Select A.*
,B.Market_Name
,RN = Row_Number() over (Partition By user_id,role_id order by a.market_id)
From Association A
Join Market B on A.market_id=B.market_id
)
Select Distinct
user_id
,role_id
,market_ids = stuff((Select concat(',',market_id ) From cte Where user_id=A.user_id and role_id=A.role_id Order By RN For XML Path ('')),1,1,'')
,market_names = stuff((Select concat(',',market_name) From cte Where user_id=A.user_id and role_id=A.role_id Order By RN For XML Path ('')),1,1,'')
From cte A
Run Code Online (Sandbox Code Playgroud)
退货
user_id role_id market_ids market_names
1 a 1,2 Arizona,Utah
2 c 3,4,5 Indiana,Illinois,Kentucky
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2125 次 |
| 最近记录: |