从sql行中的值中删除重复的值

从sql行中的值中删除重复的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的输入代码是 Emp_ID Scenarios 10902543 SCENARIO 3, SCENARIO 1, SCENARIO 1, SCENARIO 4 11083080 SCENARIO 3, SCENARIO 1, SCENARIO 3 10988779 SCENARIO 4, SCENARIO 1, SCENARIO 4, SCENARIO 3 而想要的产出应该是, Emp_ID Scenarios 10902543 SCEN

我的输入代码是

Emp_ID       Scenarios
10902543     SCENARIO 3, SCENARIO 1, SCENARIO 1, SCENARIO 4
11083080     SCENARIO 3, SCENARIO 1, SCENARIO 3
10988779     SCENARIO 4, SCENARIO 1, SCENARIO 4, SCENARIO 3
而想要的产出应该是,

Emp_ID       Scenarios
10902543    SCENARIO 3, SCENARIO 1, SCENARIO 4
11083080    SCENARIO 1, SCENARIO 3
10988779    SCENARIO 1, SCENARIO 4, SCENARIO 3
需要在不使用while循环的情况下执行此操作,请建议其他替代方法。

首先使用SplitString函数,然后使用Distinct scenario值,最后使用For xml path+STUFF将它们连接起来

分裂函数

CREATE FUNCTION [dbo].[SplitString] (@Text varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (  
   Select Pos = Row_Number() over (Order By (Select null))
        ,Value = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
   From (Select x = Cast('<x>'+ Replace(@Text,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
   Cross Apply x.nodes('x') AS B(i)
);

使用XML方法的另一种方法

模式:

现在拆分场景,应用Distinct并使用逗号将它们添加到一起

;WITH CTE AS(
    SELECT DISTINCT Emp_ID,  SPLT.B.value('.','varchar(max)') Scenarios 
    FROM(
        SELECT Emp_ID, Scenarios
        ,CAST( '<M>'+REPLACE(Scenarios,', ','</M><M>')+'</M>' AS XML) XML_DATA
        FROM #TAB
    )A
    CROSS APPLY
    A.XML_DATA.nodes('/M') AS SPLT(B)
)
SELECT DISTINCT Emp_ID
, STUFF((SELECT ','+Scenarios
FROM CTE C1 
WHERE C1.Emp_ID = C2.Emp_ID FOR XML PATH(''),TYPE
).value('.','varchar(max)'),1,1,'') as Scenarios FROM CTE C2

对首先,读一读,你会发现很多原因,为什么这个问题的答案绝对是肯定的!。第二,阅读Jeff Moden的。请共享您的sql查询。选择*从方案基础EMP_ID注释10016351方案4 10016351方案1 10016351方案4 10016351方案4 10048404方案3 10684877方案1 10048404方案1选择EMP_ID,填充选择','+注释为VARCHAR10[文本]从SCENARIOS_BASE中,EMP_ID=T.EMP_ID表示XML路径,键入.value'.',NVARCHARMAX',1,2',从SCENARIOS_BASE T GROUP中的列表输出EMP_ID刚刚开始编写一个与您非常相似的答案+1.只有一件事,stuff函数没有连接它们,那就是for-xml路径。所有的工作都是删除第一个逗号。如果使用XML,请确保&
Emp_ID      Scenarios
-----------------------------------------------
10902543    SCENARIO 1, SCENARIO 3, SCENARIO 4
11083080    SCENARIO 1, SCENARIO 3
10988779    SCENARIO 1, SCENARIO 3, SCENARIO 4
CREATE TABLE #TAB(Emp_ID BIGINT, Scenarios VARCHAR(MAX))

INSERT INTO #TAB

SELECT 10902543,'SCENARIO 3, SCENARIO 1, SCENARIO 1, SCENARIO 4'
UNION ALL
SELECT 11083080,'SCENARIO 3, SCENARIO 1, SCENARIO 3'
UNION ALL
SELECT 10988779,'SCENARIO 4, SCENARIO 1, SCENARIO 4, SCENARIO 3'
;WITH CTE AS(
    SELECT DISTINCT Emp_ID,  SPLT.B.value('.','varchar(max)') Scenarios 
    FROM(
        SELECT Emp_ID, Scenarios
        ,CAST( '<M>'+REPLACE(Scenarios,', ','</M><M>')+'</M>' AS XML) XML_DATA
        FROM #TAB
    )A
    CROSS APPLY
    A.XML_DATA.nodes('/M') AS SPLT(B)
)
SELECT DISTINCT Emp_ID
, STUFF((SELECT ','+Scenarios
FROM CTE C1 
WHERE C1.Emp_ID = C2.Emp_ID FOR XML PATH(''),TYPE
).value('.','varchar(max)'),1,1,'') as Scenarios FROM CTE C2
+----------+----------------------------------+
|  Emp_ID  |            Scenarios             |
+----------+----------------------------------+
| 10902543 | SCENARIO 1,SCENARIO 3,SCENARIO 4 |
| 10988779 | SCENARIO 1,SCENARIO 3,SCENARIO 4 |
| 11083080 | SCENARIO 1,SCENARIO 3            |
+----------+----------------------------------+