Sql 从重复项中选择/更新单个字段
这是我的Sql:Sql 从重复项中选择/更新单个字段,sql,sql-server,tsql,Sql,Sql Server,Tsql,这是我的Sql: SELECT * FROM parameter1 WHERE parameter1_ID IN (34,11) 这将导致超过400个结果(这是正常的),大多数结果在“值”列中有多个值,而一些结果在“值”列中有重复和多个值。我想消除它们各自结果中的重复值,我可以向这个查询添加什么来做到这一点? 使用mssqlstudio 查询的结果示例: ID VALUE 1 100,200 2 100,100,200 3 200,200,300 4 200,200
SELECT * FROM parameter1
WHERE parameter1_ID IN (34,11)
这将导致超过400个结果(这是正常的),大多数结果在“值”列中有多个值,而一些结果在“值”列中有重复和多个值。我想消除它们各自结果中的重复值,我可以向这个查询添加什么来做到这一点?
使用mssqlstudio
查询的结果示例:
ID VALUE
1 100,200
2 100,100,200
3 200,200,300
4 200,200,300
我想要的结果
ID VALUE
1 100,200
2 100,200
3 200,300
4 200,300
正如许多其他人所说,您存储数据的方式是一种非常糟糕的做法,几乎肯定会在将来引起更多的麻烦 这就是说,如果你实际上无法改变这一点,你仍然可以选择。在SQL Server 2017中,您可以使用
string\u split
和string\u agg
:
declare @t table(ID int, val varchar(40))
insert into @t values
(1,'100,200')
,(2,'100,100,200')
,(3,'200,200,300')
,(4,'200,200,300');
with s as
(
select distinct t.ID
,s.[value] as val
from @t as t
cross apply string_split(t.val,',') as s
)
select s.ID
,string_agg(s.val,',') as val
from s
group by s.ID;
输出
VALUE
列是否包含以逗号分隔的值列表作为字符串(例如varchar
)?是否为na数组(例如,在Postgres中)?它是与另一个表联接的结果吗?是的,它包含逗号分隔的值列表。是的,它是varchar。您应该回答您的问题并添加您正在使用的DBMS的标记。你在使用Oracle吗?您正在使用SQL Server吗?你在使用PostgreSQL吗?该解决方案可能需要一个内置的数据库功能,这些功能在不同DBMS的sIm卡中不是标准的,不确定,但应该是sql server。我是新来的,我怎么能确定我在使用预制数据库,我真的没有选择。当我尝试运行你给我的代码时,它会给我一个错误Msg 208,级别16,状态1,第8行对象名称“string_split”无效。
如何更改它以适合我的情况?@Nugget您的databsae运行的兼容性级别是否低于2017?如果是这样的话,无论是string\u split
还是string\u agg
都不适合您,但是网上有很多资源将向您展示如何在更普通的SQL中实现相同的逻辑。
+----+---------+
| ID | val |
+----+---------+
| 1 | 100,200 |
| 2 | 100,200 |
| 3 | 200,300 |
| 4 | 200,300 |
+----+---------+