我有 3 個表的關系是 Policy (N) -> PolicyService <- Service (N):
DXBusinessPolicy_Policy
| ID | 代碼 | 名稱 |
|---|---|---|
| 1 | COMBO.2103001 | [Giá n?n] T9/2020 #1 |
| 2 | IPTV-0121.002 | [Giá n?n] T8/2020 #1 |
| 3 | INT.2103001 | Chính sách 2 |
DXBusinessPolicy_Service
| ID | 代碼 | 名稱 |
|---|---|---|
| 1 | 情報局 | 互聯網 |
| 2 | 網路電視 | 網路電視 |
DXBusinessPolicy_PolicyService
| ID | 策略 ID | 服務ID |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 2 |
| 4 | 3 | 1 |
問題:輸入輸入服務(ServiceCode),輸出是PolicyID、PolicyCode、PolicyName和該策略的服務串列(串列ServiceCode用“,”連接)。
例如:我的輸入是:“INT”。結果期望:
| 政策代碼 | 政策名稱 | 服務 |
|---|---|---|
| COMBO.2103001 | [Giá n?n] T9/2020 #1 | 互聯網、IPTV |
| INT.2103001 | Chính sách 2 | 情報局 |
我試圖解決這個問題如下:
ALTER PROC FindPolicyByService
@ServiceCode varchar(200)
AS
BEGIN
SELECT dbo.DXBusinessPolicy_Policy.ID AS PolicyID,
dbo.DXBusinessPolicy_Policy.Code AS PolicyCode,
dbo.DXBusinessPolicy_Policy.Name AS PolicyName,
STRING_AGG(dbo.DXBusinessPolicy_Service.Code, ',')
FROM dbo.DXBusinessPolicy_Policy
join dbo.DXBusinessPolicy_PolicyService ON dbo.DXBusinessPolicy_Policy.ID = dbo.DXBusinessPolicy_PolicyService.PolicyID
join dbo.DXBusinessPolicy_Service ON dbo.DXBusinessPolicy_PolicyService.ServiceID = dbo.DXBusinessPolicy_Service.ID
WHERE dbo.DXBusinessPolicy_Service.Code = @ServiceCode
GROUP by dbo.DXBusinessPolicy_Policy.ID, dbo.DXBusinessPolicy_Policy.Code, dbo.DXBusinessPolicy_Policy.Name
END
exec FindPolicyByService "INT"
但結果并不是我所期望的
| 政策代碼 | 政策名稱 | 服務 |
|---|---|---|
| COMBO.2103001 | [Giá n?n] T9/2020 #1 | 情報局 |
| INT.2103001 | Chính sách 2 | 情報局 |
uj5u.com熱心網友回復:
我終于找到了對我的問題最準確的答案。謝謝大家!最好的解決辦法是:
ALTER PROC FindPolicyByService
@codes varchar(200)
AS
BEGIN
SELECT p.ID AS PolicyID,
p.Code AS PolicyCode,
p.Name AS PolicyName,
STRING_AGG(s.Code, ',') AS ServiceCode
FROM dbo.DXBusinessPolicy_Policy AS p
JOIN dbo.DXBusinessPolicy_PolicyService AS ps ON p.ID = ps.PolicyID
JOIN dbo.DXBusinessPolicy_Service AS s ON ps.ServiceID = s.ID
WHERE p.ID IN
(
SELECT subps.PolicyID
FROM dbo.DXBusinessPolicy_PolicyService AS subps
JOIN dbo.DXBusinessPolicy_Service AS subs ON subps.ServiceID = subs.ID
WHERE subs.Code = @ServiceCode
)
GROUP by p.ID, p.Code, p.Name
END
或其他解決方案:
ALTER PROC FindPolicyByService
@ServiceCode varchar(200)
AS
BEGIN
SELECT DIstinct policy.ID AS PolicyID,
policy.Code AS PolicyCode,
policy.Name AS PolicyName,
(SELECT STRING_AGG(tempService.Code, ',') FROM dbo.DXBusinessPolicy_Policy tempPolicy
JOIN dbo.DXBusinessPolicy_PolicyService tempPolicyService
ON tempPolicy.ID = tempPolicyService.PolicyID
JOIN dbo.DXBusinessPolicy_Service tempService
ON tempPolicyService.ServiceID = tempService.ID
WHERE policyservice.PolicyID = PolicyID) AS ServiceCode
FROM dbo.DXBusinessPolicy_Policy policy
JOIN dbo.DXBusinessPolicy_PolicyService policyservice
ON policy.ID = policyservice.PolicyID
JOIN dbo.DXBusinessPolicy_Service service
ON policyservice.ServiceID = service.ID AND service.Code = @ServiceCode
GROUP BY
policy.ID,
policyservice.PolicyID,
policy.Code,
policy.Name
END
這一切都給了我與預期相同的結果:
| 政策代碼 | 政策名稱 | 服務 |
|---|---|---|
| COMBO.2103001 | [Giá n?n] T9/2020 #1 | 互聯網、IPTV |
| INT.2103001 | Chính sách 2 | 情報局 |
uj5u.com熱心網友回復:
我嘗試更新我的商店,例如:
ALTER PROC FindPolicyByService
@ServiceCode varchar(200)
AS
BEGIN
SELECT policy.ID AS PolicyID,
policy.Code AS PolicyCode,
policy.Name AS PolicyName,
STRING_AGG(service.Code, ',')
FROM dbo.DXBusinessPolicy_Policy policy
LEFT JOIN dbo.DXBusinessPolicy_PolicyService policyservice
ON policy.ID = policyservice.PolicyID
LEFT JOIN dbo.DXBusinessPolicy_Service service
ON policyservice.ServiceID = service.ID AND
service.Code = @ServiceCode
GROUP BY
policy.ID,
policy.Code,
policy.Name
END
exec FindPolicyByService "INT"
我得到的結果:
| 策略 ID | 政策代碼 | 政策名稱 | 服務 |
|---|---|---|---|
| 1 | COMBO.2103001 | [Giá n?n] T9/2020 #1 | 情報局 |
| 2 | IPTV-0121.002 | [Giá n?n] T8/2020 #1 | 空值 |
| 3 | INT.2103001 | Chính sách 2 | 情報局 |
看起來service.Code = @codes條件不起作用。
我預期的結果:
| 政策代碼 | 政策名稱 | 服務 |
|---|---|---|
| COMBO.2103001 | [Giá n?n] T9/2020 #1 | 互聯網、IPTV |
| INT.2103001 | Chính sách 2 | 情報局 |
我也試過不使用service.Code = @codes條件
| 策略 ID | 政策代碼 | 政策名稱 | 服務 |
|---|---|---|---|
| 1 | COMBO.2103001 | [Giá n?n] T9/2020 #1 | 互聯網、IPTV |
| 2 | IPTV-0121.002 | [Giá n?n] T8/2020 #1 | 網路電視 |
| 3 | INT.2103001 | Chính sách 2 | 情報局 |
這個結果接近我的預期,剩下的我只想得到包括的服務 INT
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/393003.html
標籤:sql sql-server 查询语句 存储过程 字符串聚合
下一篇:兩個日期之間的SQL總和數量
