gpt4 book ai didi

sql - 连接按列分组的值

转载 作者:行者123 更新时间:2023-12-02 21:17:21 25 4
gpt4 key购买 nike

我有下表:

Code    Ref     Value
A1 Car A
A1 Car -
A1 Car B
B2 Truck CC
B2 Truck D
B2 Truck -
C3 Van E
C3 Van F
C3 Van -
C3 Van G

我试图实现的目标是一个将所有值分组在一起的连接字符串,如下所示:

Code   Ref    Value
A1 Car A-B
B2 Truck CCD-
C3 Van EF-G

我离开了这个例子here ,但无处可去。这是我想到的:

SELECT [Table].[Code]
, [Table].[Ref]
, STUFF((SELECT DISTINCT [Value]
FROM [Table2]
FOR XML PATH ('')),1, 1,'') AS Values
FROM [Table]
LEFT JOIN [Table2] ON
[Table2].[Code] = [Table].[Code]

我哪里出错了?有没有更有效的方法来做到这一点?

最佳答案

您没有任何内容将您的内部和外部引用链接到 [Table] ,并且您还需要使外部引用与众不同。最后,您需要在子查询中没有列名,或者需要是 [text()]

SELECT  [Code]
,[Ref]
,STUFF((SELECT DISTINCT [Value] AS [text()]
FROM [Table] AS T2
WHERE T1.Code = T2.Code -- LINK HERE
AND T2.Ref = T2.Ref -- AND HERE
FOR XML PATH ('')
),1, 1,'') AS [Values]
FROM [Table] AS T1
GROUP BY T1.Code, T1.Ref; -- GROUP BY HERE

顺便说一句,您不需要使用 STUFF因为您没有分隔符,STUFF通常用于从字符串的开头删除所选的分隔符。所以当你有一个类似 ,value1,value2,value3 的字符串时, STUFF(string, 1, 1, '')将用 '' 替换第一个字符留给你 value1,value2,value3 .

您还应该使用value xquery 方法来确保您不会被特殊字符绊倒,如果您不这样做并且尝试连接 ">>""<<"你最终不会得到 ">><<"如您所愿,您会得到 "&gt;&gt;&lt;&lt;" ,所以更好的查询是:

SELECT  t1.Code,
t1.Ref,
[Values] = (SELECT DISTINCT [text()] = [Value]
FROM [Table] AS t2
WHERE T1.Code = T2.Code
AND T2.Ref = T2.Ref
FOR XML PATH (''), TYPE
).value('.', 'NVARCHAR(MAX)')
FROM [Table] AS T1
GROUP BY t1.Code, t1.Ref;

附录

根据对问题的最新编辑,看起来好像您的 Value列来自另一个表,通过 Code 链接到第一个表。如果有的话,这会让您的查询更简单。您不需要JOIN ,但您仍然需要确保有一个表达式将外部表链接到子查询的内部表。我假设第一个表中的行是唯一的,因此您可能不需要分组依据:

SELECT  t1.Code,
t1.Ref,
[Values] = (SELECT DISTINCT [text()] = t2.[Value]
FROM [Table2] AS t2
WHERE T1.Code = T2.Code
FOR XML PATH (''), TYPE
).value('.', 'NVARCHAR(MAX)')
FROM [Table] AS T1;

工作示例

CREATE TABLE #Table1 (Code CHAR(2), Ref VARCHAR(10));
INSERT #Table1 VALUES ('A1', 'Car'), ('B2', 'Truck'), ('C3', 'Van');

CREATE TABLE #Table2 (Code CHAR(2), Value VARCHAR(2));
INSERT #Table2
VALUES ('A1', 'A'), ('A1', '-'), ('A1', 'B'),
('B2', 'CC'), ('B2', 'D'), ('B2', '-'),
('C3', 'F'), ('C3', '-'), ('C3', 'G');

SELECT t1.Code,
t1.Ref,
[Values] = (SELECT DISTINCT [text()] = t2.[Value]
FROM #Table2 AS t2
WHERE T1.Code = T2.Code
FOR XML PATH (''), TYPE
).value('.', 'NVARCHAR(MAX)')
FROM #Table1 AS T1;

关于sql - 连接按列分组的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29848913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com