通过表对比筛选数据:提取Table A中不在Table B指定列的内容
实现方案
根据你的需求,要筛选出Table A的column_1中既不在Table B的column_1,也不在Table B的column_2数组中的值,以下是不同SQL数据库的具体实现方式:
MySQL(8.0+版本)
如果Table B的column_2是JSON格式数组,可以用JSON_TABLE拆分数组后做排除:
SELECT a.column_1 FROM TableA a WHERE NOT EXISTS ( SELECT 1 FROM TableB b WHERE b.column_1 = a.column_1 ) AND NOT EXISTS ( SELECT 1 FROM TableB b JOIN JSON_TABLE( b.column_2, '$[*]' COLUMNS(val VARCHAR(255) PATH '$') ) jt WHERE jt.val = a.column_1 );
如果column_2是字符串形式的数组(比如[a,b,c,d]),先清理字符串再拆分:
SELECT a.column_1 FROM TableA a WHERE NOT EXISTS (SELECT 1 FROM TableB b WHERE b.column_1 = a.column_1) AND NOT EXISTS ( SELECT 1 FROM TableB b JOIN STRING_SPLIT(TRIM(BOTH '[]' FROM b.column_2), ',') jt WHERE jt.value = a.column_1 );
PostgreSQL
PostgreSQL对数组的原生支持很好,有两种常用写法:
写法1:用数组包含操作符@>
SELECT a.column_1 FROM TableA a WHERE a.column_1 NOT IN (SELECT column_1 FROM TableB) AND NOT EXISTS ( SELECT 1 FROM TableB b WHERE b.column_2 @> ARRAY[a.column_1]::TEXT[] );
写法2:拆分数组后用NOT IN
SELECT a.column_1 FROM TableA a WHERE a.column_1 NOT IN (SELECT column_1 FROM TableB) AND a.column_1 NOT IN (SELECT UNNEST(column_2) FROM TableB);
SQL Server
用OPENJSON解析JSON数组,再做排除逻辑:
SELECT a.column_1 FROM TableA a WHERE NOT EXISTS ( SELECT 1 FROM TableB b WHERE b.column_1 = a.column_1 ) AND NOT EXISTS ( SELECT 1 FROM TableB b CROSS APPLY OPENJSON(b.column_2) WITH (val VARCHAR(255) '$') jt WHERE jt.val = a.column_1 );
内容的提问来源于stack exchange,提问作者user16462786
相关产品推荐
相关产品推荐

