如果另一个表中的 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;
问题是表非常大,并且这个查询需要很长时间才能运行。有没有更有效的方法?
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个索引。