Hologres delete from public.cnpldw_dct_waybill_trace_f_1
where exists (select 1 from public.cnpldw_dct_waybill_trace_f_1_tmp b where bill_id=b.bill_id and status=b.status); 我执行的是这个语句,结果把主表全清了。tmp表里面就6万,主表2个亿,我看了逻辑是没问题的。唯一的问题是exists里面没有给主表加个别名。导致主表全清了。这个语法在mysql会报错。但是pg这个就直接过了。 这算不算bug?
这个语法在MySQL中会报错,因为MySQL不支持在EXISTS子句中使用表的别名。但是,在PostgreSQL中,这个语法是允许的,所以您在Hologres上执行这个语句时没有遇到问题。
如果您希望在MySQL中实现类似的功能,可以使用以下方法:
以下是相应的MySQL代码示例:
-- 创建临时表并插入数据
CREATE TEMPORARY TABLE temp_table AS
SELECT * FROM public.cnpldw_dct_waybill_trace_f_1;
-- 删除与tmp表中相同的数据
DELETE t
FROM temp_table t
JOIN public.cnpldw_dct_waybill_trace_f_1_tmp b ON t.bill_id = b.bill_id AND t.status = b.status;
-- 将临时表中的数据插入回主表
INSERT INTO public.cnpldw_dct_waybill_trace_f_1
SELECT * FROM temp_table;
-- 删除临时表
DROP TEMPORARY TABLE temp_table;
这个sql不写别名也是正常的语法,不会报错。问题应该是你join了多少主表的数据然后就被删除了。 ,此回答整理自钉群“实时数仓Hologres交流群”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
本技术圈将为大家分析有关阿里云产品Hologres的最新产品动态、技术解读等,也欢迎大家加入钉钉群--实时数仓Hologres交流群32314975