【问题标题】:SQL Synapse Compare data between Column(multiple values) and Column(multiple values)SQL Synapse 比较列(多个值)和列(多个值)之间的数据
【发布时间】:2021-10-30 16:04:55
【问题描述】:

我需要比较 2 个表中的 2 列。

表a:

ID|TEL
----------------
A1|1111,2222,3333

表 B:

ID|TEL
----------------
A1|2222,4444

结果应在表 A 中更新

A1|1111,2222,3333,4444

据我所知,也许我应该使用 select value from string_split (B.Tel,'|') 来拆分它。但是,我不知道如何循环比较 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 + '%' ;

【问题讨论】:

  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • 我已经编辑了我在上面尝试过的内容,但没有工作

标签: sql-server azure-synapse


【解决方案1】:

首先,您不应该像这样存储您的数据,尤其是当您必须对其执行基于集合的操作时。但是,如果您总是有效地添加数字,而不是带走数字,那么有一个使用 STRING_SPLITSTRING_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;

【讨论】:

  • 谢谢,我已经听从了您的建议并修改了一些部分以适应我的工作。这是工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
相关资源
最近更新 更多