Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 比较两个数字字符串并获取唯一值_Sql - Fatal编程技术网

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 |
+---------+---------+