返回首页

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

更新日期:2024年09月11日

对于SELECT 语句中的TABLE_references 部分,
GClusete SQL 支持下面的JOIN 语
法:
table_reference[, table_reference]

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 722
table_reference [INNER | CROSS | FULL] JOIN table_reference [join_condition]
table_reference [LEFT | RIGHT [OUTER]] JOIN table_reference [join_condition]
table_reference 定义为:

[database_name.]table_name [[AS] alias]
join_condition 定义为:

ON conditional_expr | USING (column_list)
ON 部分是用来在结果集中限定哪些行是需要的,
一般不要在这部分附加任何条件,
而是在WHERE 子句中指定这些条件。这项规定也有例外。
表的引用可以通过“ [database_name.]table_name AS alias_name ” 或
“[database_name.]table_name alias_name”来赋予一个别名:
gbase> SELECT t1.c_name,t2.lo_orderkey FROM ssbm.customer AS t1,ssbm.lineorder AS t2
WHERE t1.c_custkey = t2.lo_custkey LIMIT 5;
+--------------------+-------------+
| c_name | lo_orderkey |
+--------------------+-------------+
| Customer#000025738 | 1 |
| Customer#000018238 | 2 |
| Customer#000018238 | 2 |
| Customer#000020612 | 3 |
| Customer#000020612 | 3 |
+--------------------+-------------+
5 rows in set
如果在LEFT JOIN 的ON 或USING 部分的右表中没有匹配的记录,那么该右表一
行中的所有列都设置为NULL。可以用这种方法找出一个表和另一个表之间不匹配
的记录:
gbase> SELECT t1.stu_name,t2.c_no FROM student t1 LEFT OUTER JOIN course t2 ON
t1.stu_name=t2.stu_name WHERE c_no IS NULL;
+----------+---------+
| stu_name | c_no |
+----------+---------+
| Smith | NULL |
| KING | NULL |
| Koamma | NULL |
+----------+---------+
2 rows in set
说明

这个示例在customer 中找出stu_name 值不在course 的所有行
(也就是,
student 与course
没有对应关系的所有行)。假设course.c_no 都声明为NOT NULL。
USING(column_list)子句用于为一系列的列进行命名。这些列必须同时在两个表中
存在。如果表a 和表b 都包含列c1,c2 和c3,则以下联合会包含来自两个表的对
应的列:

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 723
a LEFT JOIN b USING (c1,c2,c3)
a LEFT JOIN b ON a.c1 = b.c1 AND a.c2 = b.c2 AND a.c3 = b.c3
在缺乏连接条件时,INNER JOIN 和,(逗号)在语义上是等价的:都是在指定的
两个表之间生成一个笛卡尔乘积(也就是,第一个表中的每一行都与第二个表中的
所有行连接起来)。
GBase UP 支持FULL JOIN/FULL OUTER JOIN
(全连接)

可以看成是LEFT JOIN
(左连接)和RIGHT JOIN(右连接)结果的合集。但是FULL JOIN 跟LEFT
JOIN...UNION RIGHT JOIN...并不完全等价,因为UNION 会去除重复记录。

示例:FULL JOIN 与LEFT JOIN...UNION RIGHT JOIN...
示例中用到的表及数据:
USE test;
CREATE TABLE t1(a int,b int);
CREATE TABLE t2(a int,b int);
INSERT INTO t1 values(11,11),(22,22),(33,33);
INSERT INTO t1 values(11,11),(22,22),(33,33);
INSERT INTO t2 values(11,11),(222,222),(333,333);
gbase> SELECT * FROM t1;
+------+------+
| a | b |
+------+------+
| 11 | 11 |
| 22 | 22 |
| 33 | 33 |
| 11 | 11 |
| 22 | 22 |
| 33 | 33 |
+------+------+
6 rows in set

gbase> SELECT * FROM t2;
+------+------+
| a | b |
+------+------+
| 11 | 11 |
| 222 | 222 |
| 333 | 333 |
+------+------+
3 rows in set
示例:
gbase> SELECT * FROM t1 FULL JOIN t2 on t1.a = t2.a;
+------+------+------+------+

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 724
| a | b | a | b |
+------+------+------+------+
| 33 | 33 | NULL | NULL |
| 33 | 33 | NULL | NULL |
| NULL | NULL | 222 | 222 |
| NULL | NULL | 333 | 333 |
| 11 | 11 | 11 | 11 |
| 11 | 11 | 11 | 11 |
| 22 | 22 | NULL | NULL |
| 22 | 22 | NULL | NULL |
+------+------+------+------+
8 rows in set

gbase> (SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a) UNION (SELECT * FROM t1 RIGHT
JOIN t2 ON t1.a = t2.a);
+------+------+------+------+
| a | b | a | b |
+------+------+------+------+
| 33 | 33 | NULL | NULL |
| NULL | NULL | 333 | 333 |
| 11 | 11 | 11 | 11 |
| NULL | NULL | 222 | 222 |
| 22 | 22 | NULL | NULL |
+------+------+------+------+
5 rows in set
当进行简单等值关联时,且JOIN 涉及分布式Hash JOIN,则需要受如下限制约束:


JOIN 两边的数据类型必须相同;

进行CHAR JOIN CHAR 时,精度必须相同;

JOIN 两边数据类型不同时,仅支持CHAR 与VARCHAR,INT 族(包括INT,
BIGINT, SMALLINT, TINYINT)与VARCHAR 之间做关联查询。
说明
注:简单等值关联是指同时满足如下两个条件的JOIN:

等值JOIN;

等值JOIN 条件两边都是物理列,而不是表达式。
上文提到,
当两个char 类型直接进行简单等值JOIN,
且JOIN 涉及分布式Hash JOIN
时,需保证两边数据具有相同精度。具体请参见如下示例:

示例:char JOIN char(相同精度)示例
表及数据:
drop table if exists t3;

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 725
drop table if exists t4;
create table t3(a char(5), b char(10));
create table t4(a char(10));

insert into t3 values('abcde', 'abcde');
insert into t4 values('abcde');
下面语句报错,
因为t3.a 类型为char(5),
t4.a 类型为char(10),
不同精度的char
类型间禁止建立等值JOIN 关系。
gbase> select * from t3 join t4 on t3.a = t4.a;
ERROR 1149 (42000): (GBA-02SC-1001) Data types of equivalence join relation
((`test.t3`.`a` =
`test.t4`.`a`))
are not supported
, data types: left is
CHAR(5),
right is CHAR(10)
t3.b 与t4.a 类型均为char(10),因此可以建立等值JOIN 关系。
gbase> select * from t3 join t4 on t3.b = t4.a;
+-------+------------+------------+
| a | b | a |
+-------+------------+------------+
| abcde | abcde | abcde |
+-------+------------+------------+

1 row in set

char JOIN varchar 示例:
表及数据:
drop table if exists t1;
drop table if exists t2;
create table t1(a char(5), b char(10));
create table t2(a varchar(10));

insert into t1 values('abcde', 'abcde');
insert into t2 values('abcde');
gbase> select * from t1 join t2 on t1.a = t2.a;

+-------+------------+-------+
| a | b | a |
+-------+------------+-------+
| abcde | abcde | abcde |
+-------+------------+-------+
1 row in set
下面语句结果为空集,因为t1.b 类型是char(10),补齐空格后为'abcde ',与
varchar 的'abcde'不等。
gbase> select * from t1 join t2 on t1.b = t2.a;
Empty set

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 726

int JOIN varchar 示例:
表及数据:
drop table if exists t5;
drop table if exists t6;
create table t5(a int);
create table t6(a varchar(10));

insert into t5 values(179);
insert into t6 values('179');
int 和varchar 间可以建立等值JOIN 关系
gbase> select * from t5 join t6 on t5.a = t6.a;
+------+------+
| a | a |
+------+------+
| 179 | 179 |
+------+------+
1 row in set

Rollback 方法
从一个未完成的状态回滚事务。

语法
[Visual Basic]
Public Overrides Sub Rollback
[C#]
public override void Rollback()

实现
IDbTransaction.Rollback()

注释
回滚方法等价于GBase 数据库的ROLLBACK 命令。
事务只能从未结束的状态
回滚(在调用了BeginTransaction 之后和Commit 之前)

gbase_list_tables ........................... 26