我將把它分成三個部分:
我有的:
我有兩張桌子Table1和Table2。
表格1
| 物件名稱 | 地位 |
|---|---|
| 一個 | 積極的 |
| C | 積極的 |
表2
| 父物件型別 | 子物件型別 |
|---|---|
| X | 一個 |
| 是 | C |
| Z | 一個 |
| 米 | C |
我想要的是:
我想撰寫一個存盤程序,給出如下所示的結果:
| 物件名稱 | 地位 | 父物件名稱 |
|---|---|---|
| 一個 | 積極的 | 坐標軸 |
| C | 積極的 | 是, 米 |
我嘗試了什么:我嘗試使用該STUFF函式,但得到了一個奇怪的結果。
這是查詢:
SELECT
ObjectName,
Status,
STUFF((SELECT '; ' table2.ParentObjectType
FROM table1
INNER JOIN table2 ON table1.[ObjectName] = table2.[ChildObjectType]
FOR XML PATH('')), 1, 1, '') [ParentObjectName]
FROM
table1
輸出
| 物件名稱 | 地位 | 父物件名稱 |
|---|---|---|
| 一個 | 積極的 | X, Z, Y, M |
| C | 積極的 | X, Z, Y, M |
非常感謝這里的任何幫助,因為我對 SQL 不熟悉,這讓我發瘋!
uj5u.com熱心網友回復:
演示:小提琴
您在父表的子查詢中缺少WHERE條件。
我也認為這是一個錯字。在 Table2 中,您有列ChildObjectType,但在您的鏈接中,您正在鏈接 ?table2.[ChildObjectName]
SELECT
ObjectName,
Status,
STUFF((SELECT '; ' table2.ParentObjectType
FROM table1
INNER JOIN table2 ON table1.[ObjectName] = table2.[ChildObjectName]
WHERE Table1.ObjectName = src.ObjectName
FOR XML PATH('')), 1, 1, '') [ParentObjectName]
FROM
table1 src
注意:從SQL Server 2017 (14.x) 及更高版本開始,您可以使用 STRING_AGG
uj5u.com熱心網友回復:
這幫助我意識到我沒有將它保存在我的代碼片段中,謝謝!請注意,FOR XML PATH它將回傳 XML 編碼文本,因此“&”變為“&”,請參見下面的示例,該示例顯示您可以添加, TYPE到您的FOR XML陳述句中;這將回傳一個 xml 資料型別,您可以使用 查詢文本value('.',...。
我個人傾向于支持 下的子查詢FROM,因此這也顯示了通過參考WHERE內的子句連接資料的另一種方式APPLY:
DECLARE @tt1 TABLE ( ObjectName VARCHAR(10), StatusValue VARCHAR(20) )
INSERT INTO @tt1
SELECT 'A','Active'
UNION ALL SELECT 'C','Active'
UNION ALL SELECT 'D&E','Active'
DECLARE @tt2 TABLE ( A VARCHAR(100), B VARCHAR(100) )
INSERT INTO @tt2 SELECT 'X','A'
INSERT INTO @tt2 SELECT 'Y','C'
INSERT INTO @tt2 SELECT 'Z','A'
INSERT INTO @tt2 SELECT 'M','C'
INSERT INTO @tt2 SELECT 'E&F','D&E' --sample "&" that should NOT render "&"
INSERT INTO @tt2 SELECT '"G"','D&E'
INSERT INTO @tt2 SELECT 'F>G','C' --sample ">" that should NOT render ">"
SELECT
tt1.*,
f1.*
FROM
(SELECT ObjectName,StatusValue FROM @tt1) tt1
OUTER APPLY (SELECT
COALESCE(STUFF(
(SELECT ',' CAST(tt2.A AS VARCHAR(10))
FROM
@tt2 tt2 WHERE tt2.B = tt1.ObjectName FOR XML PATH(''), TYPE ).value('.','nvarchar(max)'), 1,1,''),'') [csv1] ) f1
我假設您使用的是沒有字串聚合函式的 SQL 服務器版本?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/537289.html
