报错如下
Citus中,错误消息"complex joins are only supported when all distributed tables are co-located and joined on their distribution columns"通常表示在执行复杂的连接查询时,要求所有分布式表必须具有相同的分布列(distribution columns),并且这些分布式表的数据必须位于同一节点上,这样才能保证查询的正确性和性能。如果不满足这些条件,则会导致查询失败。
如下三个表的分片键都为InnerCode,但是关联列是有是有三个的InnerCode、EndDate、IndexCode,便会有此报错了
jydb@jydb=> begin;
BEGIN
jydb@jydb=*> DELETE FROM JYDB.MF_CalmarRatio A
jydb@jydb-*> USING JYDB.MF_Calmar
jydb@jydb-*> JOIN JYDB.tmp_MF_CalmarRatio B ON F.InnerCode = B.InnerCode
jydb@jydb-*> AND F.EndDate = B.EndDate
jydb@jydb-*> AND F.IndexCode = B.IndexCode
jydb@jydb-*> LEFT JOIN JYDB.MF_CalmarRatio_TMP C ON F.InnerCode = C.InnerCode
jydb@jydb-*> AND F.EndDate = C.EndDate
jydb@jydb-*> AND F.IndexCode = C.IndexCode
jydb@jydb-*> WHERE A.id = F.id
jydb@jydb-*> AND C.InnerCode IS NULL;
ERROR: complex joins are only supported when all distributed tables are co-located and joined on their distribution columns
jydb@jydb=!>
改成CTE
将CTE与delete语句结合使用来删除主表中的行
使用CTE等价重写如下所示
WITH cte AS (
SELECT F.id FROM JYDB.MF_CalmarRatio F
JOIN JYDB.tmp_MF_CalmarRatio B ON F.InnerCode = B.InnerCode
AND F.EndDate = B.EndDate
AND F.IndexCode = B.IndexCode
LEFT JOIN JYDB.MF_CalmarRatio_TMP C ON F.InnerCode = C.InnerCode
AND F.EndDate = C.EndDate
AND F.IndexCode = C.IndexCode
WHERE C.InnerCode IS NULL
)
DELETE FROM JYDB.MF_CalmarRatio A WHERE A.id IN (SELECT id FROM cte);
最后修改时间:2023-03-02 17:15:13
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。