Sql 比较两个数字字符串并获取唯一值
以下是我为更好地说明我的问题而制作的示例表:Sql 比较两个数字字符串并获取唯一值,sql,Sql,以下是我为更好地说明我的问题而制作的示例表: Create Table SampleTable( TableID int, NumberRow nvarchar(500) ) Insert into SampleTable Values(1, '15,21,23,41,44,5,50,59,6,') Insert into SampleTable Values(2, '10,24,29,41,5,50,59,6,73,') Insert into SampleTable Valu
Create Table SampleTable(
TableID int,
NumberRow nvarchar(500)
)
Insert into SampleTable Values(1, '15,21,23,41,44,5,50,59,6,')
Insert into SampleTable Values(2, '10,24,29,41,5,50,59,6,73,')
Insert into SampleTable Values(3, '10,15,21,24,29,33,41,50,59,60,61,62,66,73,')
Insert into SampleTable Values(4, '10,15,21,24,28,33,37,41,44,5,50,6,60,61,62,66,')
Insert into SampleTable Values(5, '15,24,33,41,5,6,61,62,66,73,')
之后,我编写了一个自连接查询:
Select
t1.TableID AS ID1,
t2.TableID AS ID2,
t1.NumberRow AS Numbers1,
t2.NumberRow AS Numbers2
From SampleTable t1
inner join SampleTable t2
on t1.TableID = t2.TableID - 1
Order by t2.TableID asc
其结果是:
ID1 ID2 Numbers1 Numbers2
-------------------------------------------------------------------------------------
1 2 15,21,23,41,44,5,50,59,6, 10,24,29,41,5,50,59,6,73,
2 3 10,24,29,41,5,50,59,6,73, 10,15,21,24,29,33,41,50,59,60,61,62,66,73,
3 4 10,15,21,24,29,33,41,50,59,60,61,62,66,73, 10,15,21,24,28,33,37,41,44,5,50,6,60,61,62,66,
4 5 10,15,21,24,28,33,37,41,44,5,50,6,60,61,62,66, 15,24,33,41,5,6,61,62,66,73,
现在,我想制作两列,其中显示两列(Numbers1和Numbers2)唯一的数字字符串
到目前为止,我还没有想出任何解决办法。我的另一种方法是将数字设置为列而不是字符串,但我仍然不知道如何解决我的问题。也许这个查询会有所帮助,但我同意表的设计考虑
select DISTINCT value as NUMBER1 ,'' AS NUMBER2 from (
Select
t1.TableID AS ID1,
t2.TableID AS ID2,
t1.NumberRow AS Numbers1,
t2.NumberRow AS Numbers2
From SampleTable t1
inner join SampleTable t2
on t1.TableID = t2.TableID - 1
) as tmp_tbl
CROSS APPLY string_split(tmp_tbl.Numbers1,',')
UNION ALL
select DISTINCT '', value from (
Select
t1.TableID AS ID1,
t2.TableID AS ID2,
t1.NumberRow AS Numbers1,
t2.NumberRow AS Numbers2
From SampleTable t1
inner join SampleTable t2
on t1.TableID = t2.TableID - 1
) as tmp_tbl
CROSS APPLY string_split(tmp_tbl.Numbers1,',')
+---------+---------+
| NUMBER1 | NUMBER2 |
+---------+---------+
| | |
| 10 | |
| 15 | |
| 21 | |
| 23 | |
| 24 | |
| 28 | |
| 29 | |
| 33 | |
| 37 | |
| 41 | |
| 44 | |
| 5 | |
| 50 | |
| 59 | |
| 6 | |
| 60 | |
| 61 | |
| 62 | |
| 66 | |
| 73 | |
| | |
| | 10 |
| | 15 |
| | 21 |
| | 23 |
| | 24 |
| | 28 |
| | 29 |
| | 33 |
| | 37 |
| | 41 |
| | 44 |
| | 5 |
| | 50 |
| | 59 |
| | 6 |
| | 60 |
| | 61 |
| | 62 |
| | 66 |
| | 73 |
+---------+---------+
规范图式;阅读Good day Tertmartus,您的数据库设计非常有问题,不符合您的需要。是的,我们可以解决它并提供解决方案,但这并不意味着您应该使用它。表格结构用于在表格的每个单元格中存储单个值。使用带分隔符的多个值可能会导致vert性能不佳,因为每次使用该值时都需要对其进行削减,并且可能需要对其进行拆分。您真的应该考虑重新设计数据库。@Ronenariley这只是一个示例表。在实际项目中,数值单独存储在一列中。我制作这个表是为了存储字符串值,因为我认为这样更容易理解我的观点。所以你应该提供原始结构,否则你会得到一个错误问题的解决方案。您应该发布DDL+DML,它尽可能接近生产场景。
select DISTINCT value as NUMBER1 ,'' AS NUMBER2 from (
Select
t1.TableID AS ID1,
t2.TableID AS ID2,
t1.NumberRow AS Numbers1,
t2.NumberRow AS Numbers2
From SampleTable t1
inner join SampleTable t2
on t1.TableID = t2.TableID - 1
) as tmp_tbl
CROSS APPLY string_split(tmp_tbl.Numbers1,',')
UNION ALL
select DISTINCT '', value from (
Select
t1.TableID AS ID1,
t2.TableID AS ID2,
t1.NumberRow AS Numbers1,
t2.NumberRow AS Numbers2
From SampleTable t1
inner join SampleTable t2
on t1.TableID = t2.TableID - 1
) as tmp_tbl
CROSS APPLY string_split(tmp_tbl.Numbers1,',')
+---------+---------+
| NUMBER1 | NUMBER2 |
+---------+---------+
| | |
| 10 | |
| 15 | |
| 21 | |
| 23 | |
| 24 | |
| 28 | |
| 29 | |
| 33 | |
| 37 | |
| 41 | |
| 44 | |
| 5 | |
| 50 | |
| 59 | |
| 6 | |
| 60 | |
| 61 | |
| 62 | |
| 66 | |
| 73 | |
| | |
| | 10 |
| | 15 |
| | 21 |
| | 23 |
| | 24 |
| | 28 |
| | 29 |
| | 33 |
| | 37 |
| | 41 |
| | 44 |
| | 5 |
| | 50 |
| | 59 |
| | 6 |
| | 60 |
| | 61 |
| | 62 |
| | 66 |
| | 73 |
+---------+---------+