SQL Synapse 比较 Column(multiple values) 和 Column(multiple values) 之间的数据
SQL Synapse Compare data between Column(multiple values) and Column(multiple values)
我需要比较 2 table 中的 2 列。
table一个:
ID|TEL
----------------
A1|1111,2222,3333
TABLE乙:
ID|TEL
----------------
A1|2222,4444
结果应在 TABLE A
中更新
A1|1111,2222,3333,4444
据我所知,也许我应该使用 string_split (B.Tel,'|') 中的 select 值来拆分它。但是,我不知道如何循环比较A和B。
请帮忙
这是我试过的方法,但没有用。
with split_tel as
(select id,
Value tel
from B
CROSS APPLY STRING_SPLIT(tel, ','))
,pre as (select sp.id
,sp.tel as split
,A.tel as target
from split_tel sp
inner join A
on sp.id = A.id)
select id,split,target
from pre
where split like '%' + target + '%' ;
首先,您真的不应该像这样存储数据,尤其是当您必须对其进行基于集合的操作时。但是,如果您始终有效地添加数字而不是删除数字,则有一个使用 STRING_SPLIT
和 STRING_AGG
的简单解决方案:
IF OBJECT_ID('tempdb..#tmpA') IS NOT NULL DROP TABLE #tmpA
IF OBJECT_ID('tempdb..#tmpB') IS NOT NULL DROP TABLE #tmpB
CREATE TABLE #tmpA (
id VARCHAR(5) NOT NULL,
tel VARCHAR(100) NOT NULL
);
CREATE TABLE #tmpB (
id VARCHAR(5) NOT NULL,
tel VARCHAR(100) NOT NULL
);
--INSERT INTO #tmpA VALUES ( 'A1', '1111,2222,3333' );
--INSERT INTO #tmpB VALUES ( 'A1', '2222,4444' );
INSERT INTO #tmpA
SELECT 'A1', '1111,2222,3333'
UNION ALL
SELECT 'B1', '2222'
INSERT INTO #tmpB
SELECT 'A1', '2222,4444'
UNION ALL
SELECT 'B1', '3333'
SELECT id, STRING_AGG( value, ',' ) tel
FROM
(
SELECT a.id, x.value
FROM #tmpA a
CROSS APPLY STRING_SPLIT( a.tel, ',' ) x
UNION
SELECT b.id, x.value
FROM #tmpB b
CROSS APPLY STRING_SPLIT( b.tel, ',' ) x
) y
GROUP BY id;
我需要比较 2 table 中的 2 列。
table一个:
ID|TEL
----------------
A1|1111,2222,3333
TABLE乙:
ID|TEL
----------------
A1|2222,4444
结果应在 TABLE A
中更新A1|1111,2222,3333,4444
据我所知,也许我应该使用 string_split (B.Tel,'|') 中的 select 值来拆分它。但是,我不知道如何循环比较A和B。
请帮忙
这是我试过的方法,但没有用。
with split_tel as
(select id,
Value tel
from B
CROSS APPLY STRING_SPLIT(tel, ','))
,pre as (select sp.id
,sp.tel as split
,A.tel as target
from split_tel sp
inner join A
on sp.id = A.id)
select id,split,target
from pre
where split like '%' + target + '%' ;
首先,您真的不应该像这样存储数据,尤其是当您必须对其进行基于集合的操作时。但是,如果您始终有效地添加数字而不是删除数字,则有一个使用 STRING_SPLIT
和 STRING_AGG
的简单解决方案:
IF OBJECT_ID('tempdb..#tmpA') IS NOT NULL DROP TABLE #tmpA
IF OBJECT_ID('tempdb..#tmpB') IS NOT NULL DROP TABLE #tmpB
CREATE TABLE #tmpA (
id VARCHAR(5) NOT NULL,
tel VARCHAR(100) NOT NULL
);
CREATE TABLE #tmpB (
id VARCHAR(5) NOT NULL,
tel VARCHAR(100) NOT NULL
);
--INSERT INTO #tmpA VALUES ( 'A1', '1111,2222,3333' );
--INSERT INTO #tmpB VALUES ( 'A1', '2222,4444' );
INSERT INTO #tmpA
SELECT 'A1', '1111,2222,3333'
UNION ALL
SELECT 'B1', '2222'
INSERT INTO #tmpB
SELECT 'A1', '2222,4444'
UNION ALL
SELECT 'B1', '3333'
SELECT id, STRING_AGG( value, ',' ) tel
FROM
(
SELECT a.id, x.value
FROM #tmpA a
CROSS APPLY STRING_SPLIT( a.tel, ',' ) x
UNION
SELECT b.id, x.value
FROM #tmpB b
CROSS APPLY STRING_SPLIT( b.tel, ',' ) x
) y
GROUP BY id;