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中实现类似的功能,可以使用以下方法:
- 使用临时表存储主表和tmp表的数据。
- 在临时表中删除与tmp表中相同的数据。
- 将临时表中的数据插入回主表。
- 删除临时表。
以下是相应的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交流群”
本文来自投稿,不代表新手站长_郑州云淘科技有限公司立场,如若转载,请注明出处:https://www.cnzhanzhang.com/11501.html