db-link 查询语法约束如下
GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
606
db-link 表只能出现在顶层查询,或同源dblink 的子查询中。出现在本地表
的子查询中时,必须放在relation 子查询中。
•
例如:如下语句会报语法错误,因为db-link 出现在本地表的子查询中时,
必须用relation 子查询包围。
select * from t1 where exists (select 1 from t2@gc_link as t2 where t2.id = t1.id);
•
该语句可以修改为如下形式,以保证符合语法规则:
select * from t1 where exists (select 1 from (select 1 from t2@gc_link) as t2 where t2.id
= t1.id);
同源的db-link 表可以直接JOIN。
dblink 表禁止与local table,
relation subquery,
非同源dblink 表,产生直接JOIN 关系。
•
例如:t1@gc_link JOIN t2@gc_link 是允许的;但t1@gc_link JOIN t2 是不
允许的,
因为db-link 表禁止与本地表直接JOIN,
可以改写SQL 语句为如
下形式:
… (select * from t1@gc_link) t, t2 …
db-link 表的子查询中,禁止出现本地表,非同源dblink 表。
•
例如:select * from t1@gc_link where exists (select 1 from t2);是不允许的,
因为db-link 表t1@gc_link 的子查询中出现了本地表t2。可以改写为如下
形式:
select * from (select * from t1@gc_link) t where exists (select 1 from t2);
group by 或order by 中的相关子查询,禁止出现db-link 表。
GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
607
注意
如果仅仅是简单使用,如insert into local_table select * from 同源dblink
表,则可以忽略本节的约束。当查询存在db-link 表与本地表混用(例
如db-link 表JOIN 本地表),或与非同源db-link 表混用时,则需要
遵守如下语法约束,否则查询会报语法错误;
同源db-link 指db-link 的名字相同,名字不同的db-link 称为非同源
db-link。例如t1@gc_link 和t2@gc_link 被认为是同源db-link 的两个
表。t1@gc_link 和x1@gc_link2,被认为是非同源db-link 表,即使
gc_link 和gc_link2 在创建时,using 的是同一个数据源,由于其db-link
名字不同,仍然认为是非同源的。