Sql 拆分字符串后显示两个表之间的唯一数据
我有两个表,都包含4列。我希望查询中包含以下内容:Sql 拆分字符串后显示两个表之间的唯一数据,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我有两个表,都包含4列。我希望查询中包含以下内容: 当两个表的前3列相同时 检查第4列,并将文本拆分为 如果文本100%相同(不查看订单) 然后显示这两个表之间的差异 这些表如下所示,例如: 表1: c1 |c2 | c3| column-text ------------------------------ | a | a | a | hello | ------------------------------ | a | a | b | text |
代码>
c1 |c2 | c3| column-text
------------------------------
| a | a | a | hello |
------------------------------
| a | a | b | text |
------------------------------
| a | b | a | just;an;example|
------------------------------
| a | b | b | st0ckexchange |
------------------------------
表2:
c1 |c2 | c3| column-text
------------------------------
| a | a | b | text |
------------------------------
| a | a | a | everyone;hello |
------------------------------
| a | b | a | example;just;an|
------------------------------
| a | b | b | stackoverflow |
------------------------------
结果将是:
c1 |c2 | c3| column-text-t1 | column-text-t2
----------------------------------------------
| a | b | b | hello | everyone;hello|
----------------------------------------------
| a | b | b | st0ckexchange | stackoverflow |
----------------------------------------------
目前我正在使用此查询:
Select table1.c1, table1.c2, table1.c3, table1.column-text, table2.column- text
from table1
join table2 on table1.c1 = table2.c1
and table1.c2 = table2.c2
and table1.c3 = table2.c3
where table1.column-text <> table2.column-text
选择表1.c1、表1.c2、表1.c3、表1.column-text、表2.column-text
来自表1
将表2连接到表1.c1=表2.c1
表1.c2=表2.c2
表1.c3=表2.c3
其中table1.column-text table2.column-text
但这并不能解决使用拆分列文本中的字符串时的问题代码>和混合
抱歉,如果问题有点模糊,我在解释问题时遇到了很多麻烦
Declare @Table1 table (c1 varchar(5), c2 varchar(5), c3 varchar(5),[column-text] varchar(50))
Insert Into @Table1 values
('a','a','a','hello'),
('a','a','b','text'),
('a','b','a','just;an;example'),
('a','b','b','st0ckexchange')
Declare @Table2 table (c1 varchar(5), c2 varchar(5), c3 varchar(5),[column-text] varchar(50))
Insert Into @Table2 values
('a','a','b','text'),
('a','a','a','everyone;hello'),
('a','b','a','example;just;an'),
('a','b','b','stackoverflow')
;with cte as (
Select *,Hits = sum(1) over (Partition by C1,C2,C3,Value)
From (
Select Src=1,* From @Table1
Union All
Select Src=2,* From @Table2
) A
Cross Apply string_split([column-text],';') B
)
Select A.c1
,A.c2
,A.c3
,[column-text-t1] = (Select max([column-text]) from @Table1 where c1=A.C1 and c2=A.c2 and c3=A.c3)
,[column-text-t2] = (Select max([column-text]) from @Table2 where c1=A.C1 and c2=A.c2 and c3=A.c3)
From cte A
Where Hits=1
Group By A.C1,A.C2,A.C3
返回
c1 c2 c3 column-text-t1 column-text-t2
a a a hello everyone;hello
a b b st0ckexchange stackoverflow
您应该修复数据结构。您不应该以分隔字符串形式存储事物列表。@GordonLinoff您完全正确,但我确实从另一个程序中获取了这些数据,我正在读取这些数据。我与他们如何向我传递数据无关。我在其上运行它不会显示hello和everyone;你好
tho?@wouterdejong更正。我有一个拖尾HAVING子句。Thiw被移除,链接也被移除updated@wouterdejong我添加了表变量作为演示。只需修改第一个查询并输入实际的表名。谢谢,现在我明白了,我仍然使用实际的表名测试它,但是在)
@wouterdejong附近得到了一个错误的语法。您是否替换了所有(at)表1和(at)表2共4个