返回首页

gbase数据、南大通用产品文档:GBase8c

更新日期:2024年09月11日

Join 顺序的Hint
功能描述
指明join 的顺序,包括内外表顺序。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
569
语法格式
仅指定join 顺序,不指定内外表顺序。
leading(join_table_list)
同时指定join 顺序和内外表顺序,内外表顺序仅在最外层生效。
leading((join_table_list))
参数说明
join_table_list 为表示表join 顺序的hint 字符串,可以包含当前层的任意个表(别名),
或对于子查询提升的场景,
也可以包含子查询的hint 别名,
同时任意表可以使用括号指定优
先级,表之间使用空格分隔。

表只能用单个字符串表示,不能带schema。

表如果存在别名,需要优先使用别名来表示该表。
join table list 中指定的表需要满足以下要求,否则会报语义错误。

list 中的表必须在当前层或提升的子查询中存在。

list 中的表在当前层或提升的子查询中必须是唯一的。如果不唯一,需要使用不同的别
名进行区分。

同一个表只能在list 里出现一次。

如果表存在别名,则list 中的表需要使用别名。
例如:
leading(t1 t2 t3 t4 t5)表示:t1、t2、t3、t4、t5 先join,五表join 顺序及内外表不限。
leading((t1 t2 t3 t4 t5))表示:t1 和t2 先join,t2 做内表;再和t3 join,t3 做内表;再和
t4 join,t4 做内表;再和t5 join,t5 做内表。
leading(t1 (t2 t3 t4) t5)表示:t2、t3、t4 先join,内外表不限;再和t1、t5 join,内外表
不限。
leading((t1 (t2 t3 t4) t5))表示:t2、t3、t4 先join,内外表不限;在最外层,t1 再和t2、t3、
t4 的join 表join,t1 为外表,再和t5 join,t5 为内表。
leading((t1 (t2 t3) t4 t5)) leading((t3 t2))表示:t2、t3 先join,t2 做内表;
然后再和t1 join,

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
570
t2、t3 的join 表做内表;然后再依次跟t4、t5 做join,t4、t5 做内表。
示例
对示例中原语句使用如下hint:
explain
select /*+ leading((((((store_sales store) promotion) item) customer) ad2) store_returns)
leading((store store_sales))*/ i_product_name product_name ...
该hint 表示:表之间的join 关系是:store_sales 和store 先join,store_sales 做内表,然
后依次跟promotion, item, customer, ad2, store_returns 做join。生成计划如下所示:
图中计划顶端warning 的提示详见Hint 的错误、冲突及告警的说明。

GBA-01BR-0077
错误码
错误标识
错误显示信息
GBA-01BR-0077

Get Table Create SQL Error
分析与建议
检查表恢复中的元数据文件夹的内容

GBase 8a MPP Cluster 产品手册
7 附录
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1702
错误出现原因
获取表建表DDL 错误
分析与建议
确定server 状态,是否能够执行show create table

DELIMIDENT 环境变量指定括在双引号 ( " ) 之间的字符串是定界数据库标识。
DELIMIDENT 环境变量在客户机系统上也是受支持的,
在客户机系统中它可以设置为 y、
n 或不设置。
y 指定客户机应用程序必须使用单引号 ( ' ) 来对字符串定界,且必须仅在定界的
SQL 标识(它可以支持比未定界的标识中有效的字符集更大的字符集)的两边使用双
引号 ( " )。定界字符串或定界标识中的字母是区分大小写的。这是 OLE DB 和 .NET
的缺省值。
n 指定客户机应用程序可以使用双引号 ( " ) 或单引号 ( ' ) 来对字符串定界,但
是不对 SQL 标识定界。
如果数据库服务器在需要 SQL 标识的上下文中遇到用双引号
或单引号定界的字符串,将发出错误。符合 SQL 标识条件的所有者名称可以用单引
号 ( ' ) 来定界。 必须使用一对相同的引号来对字符串定界。
这是 ESQL/C、JDBC 和 ODBC 的缺省值。具有 ESQL/C 作为底层的 API(如
GBase 8s 4GL、DataBlade® API (LIBDMI) 和 C++ API)具有与 ESQL/C 相同的行为,
并使用“n”作为缺省值(如果在客户机系统上没有指定 DELIMIDENT 的值)。
在客户机系统上指定没有值的 DELIMIDENT 环境变量要求客户机应用程序使用
DELIMIDENT 设置,这是应用程序编程接口 (API) 的缺省设置。


GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 164 -

不需要任何值;DELIMIDENT 生效(如果它存在的话),且当它在环境变量列表上时
仍然有效。当 DELIMIDENT 在服务器级别设置时,除去此变量需要重新启动服务器。
定界标识可以包含空格(如短语 "Vitamin E"),也可以与 SQL 关键字完全相同(如
"TABLE" 或 "USAGE")。还可使用定界标识来声明包含 SQL 标识的缺省字符集之外的
字符的数据库标识(如“Column #6”)。在缺省语言环境中,此缺省字符集由字母、数字
和下划线 ( _ ) 符号组成。
即使设置了 DELIMIDENT,您也可以使用单引号 ( ' ) 来将权限标识定界为数据库对
象名称的所有者名称部分,如以下示例所示:
RENAME COLUMN 'Owner'.table2.collum3 TO column3;
此示例是一般规则的例外,一般规则是这样的:当设置了 DELIMIDENT 时,SQL 解析
器将以单引号定界的字符串解释为文字串,而将以双引号 ( " ) 定界的字符串解释为 SQL
标识。
数据库标识符(也称为 SQL 标识符)是数据库对象(例如:表和列)的名称。存储器
标识是存储器对象(例如,数据库空间、Blob 空间和智能大对象空间)的名称。不能使用
DELIMIDENT 来声明包含缺省 SQL 字符集以外字符的存储器标识。
定界标识是区分大小写的。要使用定界标识,用 GBase 8s ESQL/C 编写的应用程序必
须在编译时和运行时设置 DELIMIDENT。
重要: 如果尚未设置 DELIMIDENT,应注意对它进行设置可能会导致在定界 SQL 标识
(例如,字符串文字的定界符)之外的上下文中使用双引号 ( " ) 的现有 .sql 脚本或客
户机应用程序出错。如果设置了 DELIMIDENT,那么必须对不是 SQL 标识的定界构造使用
单引号 ( ' ) 而不是双引号。
在使用 C shell 并已设置了 DELIMIDENT 的 UNIX™ 系统上,可通过以下命令禁用此
功能(它会导致双引号之间的任何内容都解释为 SQL 标识):
unsetenv DELIMIDENT