SQL Server中的多对多比较

SQL Server中的多对多比较,sql,sql-server,Sql,Sql Server,在SQL Server中,该列包含一些逗号分隔格式的中心代码,如 000070001180000700012000007001230000700163 与相同值比较的值,但中心代码分隔顺序不同,如0000700012300007000118000070001200000700163 如何比较SQL Server中的多对多值。请帮助任何人解决此问题。您不应该将所有值都放在一个字符串中。在将数据引入表中之前,请尝试解析数据,以便可以将每个元素作为varchar添加到表中的新行中。之后,可以更容易地将

在SQL Server中,该列包含一些逗号分隔格式的中心代码,如 000070001180000700012000007001230000700163

与相同值比较的值,但中心代码分隔顺序不同,如0000700012300007000118000070001200000700163


如何比较SQL Server中的多对多值。请帮助任何人解决此问题。

您不应该将所有值都放在一个字符串中。在将数据引入表中之前,请尝试解析数据,以便可以将每个元素作为varchar添加到表中的新行中。之后,可以更容易地将整个列与一个值进行比较。

要在CostElementName中查找具有相同值且顺序相同/不相同的行,请执行以下操作:

declare @t table
(
    id int identity,
    CostElementGroup varchar(10),
    CostElementName varchar(max)
);

insert into @t
(
    CostElementGroup, CostElementName
)
values ('A', '1, 2, 3, 4, 5'), ('A', '5, 4, 3, 2, 1'),
('A', '3, 4, 5'), ('A', '3, 5, 4'),
('A', '1, 2, 3'), ('A', '1, 2');

select *
from @t as a
join @t as b on a.CostElementGroup = b.CostElementGroup and a.id <> b.id
where 
--same number of elements in the comma delimited string...
len(a.CostElementName) - len(replace(a.CostElementName, ',', '')) = len(b.CostElementName) - len(replace(b.CostElementName, ',', ''))
and not exists --...without any diff
(
    select ltrim(x.value)
    from string_split(a.CostElementName, ',') as x
    except
    select ltrim(y.value)
    from string_split(b.CostElementName, ',') as y
);

修正你的数据模型!不要在字符串中存储多个值!你需要修正你的设计;如果不存储分隔值,则不会出现问题。您使用的是哪个版本的SQL Server?你期望的输出是什么?