根据另一个表中是否存在多个列的值来更新标志

问题描述 投票:0回答:1

如果另一个表中的 4 列中有匹配的值,我想更新当前表中的标志。只需要匹配一列即可将其设置为 True。

数据如下表1所示

id col1 col2 col3 col4
1 鸡蛋 酒吧 瓦尔
2

表2

分数 col1 col2 col3 col4
100 鸡蛋 酒吧 瓦尔
200

我想添加一列存在,它基本上说明表1中的col1是否与表2中的col1匹配或表1中的col2与表2中的col2匹配等等..

update table1 a
set exists_in_tbl2 = case when exists(
                 select 1 from table2
                 where (a.col1=b.col1 or a.col2=b.col2 or a.col3 =b.col3 or a.col4=b.col4)
                 ) then true
             else false end;

问题是表非常大,并且这个查询需要很长时间才能运行。有没有更有效的方法?

sql sql-update snowflake-cloud-data-platform
1个回答
0
投票

FIRST 为“exists_in_tbl2”列使用默认值 false

SECOND 只是您的查询,不扫描和更新所有内容,例如:

update table1 a
set    exists_in_tbl2 = true
when   exists(select 1
              from   table2
              where  a.col1=b.col1 or a.col2=b.col2 or a.col3 =b.col3 or a.col4=b.col4);

如果您的 RDBMS 支持列式索引存储(如 Microsoft SQL Server),请在 col1 到 col4 的两个表上使用它,以使用压缩值和最大并行度运行此查询...

使用良好的优化器加速此查询的另一种方法是将子查询拆分为多个简化的查询,例如:

update table1 a
set    exists_in_tbl2 = true
when   exists(select 1
              from   table2
              where  a.col1=b.col1
              UNION  ALL
              select 1
              from   table2
              WHERE  a.col2=b.col2 
              UNION  ALL
              select 1
              from   table2
              WHERE  a.col3 =b.col3
              UNION  ALL
              select 1
              from   table2
              WHERE  a.col4=b.col4);

并在每个表的4列上创建4个索引。

© www.soinside.com 2019 - 2024. All rights reserved.