VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

外连接(+)

功能描述

Vastbase在Oracle兼容模式下支持外连接功能,且从Build 14开始支持使用(+)实现如下特性:

  • 一表对多的连接特性,即单表不同字段外连接不同表的不同字段。

    • 在多个条件连接中使用多表的不同字段。可参见示例1

    • 在复杂表达式中使用多表不同字段。可参见示例2

  • 多对多表的连接特性,即多表相互连接。如t1 OUTER JOIN t2与t3时,t2依然可以 OUTER JOIN t3。可参见示例3

本特性在SQL语句中的表现为:

where子句的相等条件中,某一端的单表字段带有(+),且另一端的表并非同一张表。

注意事项

  • 该功能仅在数据库兼容模式为Oracle时能够使用(即初始化数据库时DBCOMPATIBILITY='A')。

  • 关于使用(+)的一些注意事项:

    • (+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
    • 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符。
    • (+)操作符只适用于列,而不能用在表达式上。
    • (+)操作符不能与or和in操作符一起使用。
    • (+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
  • 不支持SQL语句中存在有向环的外连接。例如以下SQL语句中存在t1->t2->t3->t1的有向环,会执行失败:

    SELECT * FROM t1,t2,t3 WHERE t1.a(+)=t2.a and t2.b(+)=t3.b and t3.c(+)=t1.c;
    

示例

示例1 在多个条件连接中使用不同字段。

1、创建测试表并插入数据。

create table t1(id int,str varchar(50));
create table t2(id int,str varchar(50));
create table t3(id int,str varchar(50));
insert into t1 values(1,'aaa');
insert into t1 values(11,'a1');
insert into t2 values(1,'bbb');
insert into t2 values(12,'b1');
insert into t3 values(3,'aaa');
insert into t3 values(13,'c1');
insert into t3 values(100,'b1');

2、使用外连接查询。

select * from t1,t2,t3 where t1.id(+)=t2.id and t3.str=t1.str(+);

查询结果为如下:

 id | str | id | str | id  | str
----+-----+----+-----+-----+-----
  1 | aaa |  1 | bbb |   3 | aaa
    |     |  1 | bbb |  13 | c1
    |     |  1 | bbb | 100 | b1
    |     | 12 | b1  |   3 | aaa
    |     | 12 | b1  |  13 | c1
    |     | 12 | b1  | 100 | b1
(6 rows)

示例2 在复杂表达式中使用多表不同字段。

1、创建测试表并插入数据。

create table t23(id int,id2 int,str varchar(50));
create table t24(id int,id2 int,str varchar(50));
create table t25(id int,id2 int,str varchar(50));
insert into t23 values(10,100,'aaa');
insert into t23 values(230,230,'t230');
insert into t24 values(3,70,'t240');
insert into t24 values(3,0,'t241');
insert into t25 values(7,251,'aaa');
insert into t25 values(250,250,'t250');

2、使用外连接查询。

select * from t23,t24,t25 where t23.id(+)=t24.id + t25.id;

查询结果为如下:

 id | id2 | str | id | id2 | str  | id  | id2 | str
----+-----+-----+----+-----+------+-----+-----+------
 10 | 100 | aaa |  3 |  70 | t240 |   7 | 251 | aaa
    |     |     |  3 |  70 | t240 | 250 | 250 | t250
 10 | 100 | aaa |  3 |   0 | t241 |   7 | 251 | aaa
    |     |     |  3 |   0 | t241 | 250 | 250 | t250
(4 rows)

示例3 多表相互连接

1、创建测试表t1、t2、t3并插入测试数据。

CREATE TABLE t1(id int,str varchar(50),a int,b int);
CREATE TABLE t2(id int,str varchar(50),a int,b int);
CREATE TABLE t3(id int,str varchar(50),a int,b int);
INSERT INTO t1 VALUES (1,'aaa',42,70);
INSERT INTO t1 VALUES(11,'a1',43,71);
INSERT INTO t2 VALUES(1,'bbb',60,70);
INSERT INTO t2 VALUES(12,'b1',44,72);
INSERT INTO t3 VALUES(3,'aaa',60,73);
INSERT INTO t3 VALUES(13,'c1',45,74);
INSERT INTO t3 VALUES(100,'b1',46,75);

2、执行多表外连接查询。

SELECT * FROM t1,t2,t3 WHERE t1.id(+)=t2.id and t1.str(+)=t3.str and t2.a(+)=t3.a;

结果返回如下:

 id | str | a  | b  | id | str | a  | b  | id  | str | a  | b
----+-----+----+----+----+-----+----+----+-----+-----+----+----
  1 | aaa | 42 | 70 |  1 | bbb | 60 | 70 |   3 | aaa | 60 | 73
    |     |    |    |    |     |    |    |  13 | c1  | 45 | 74
    |     |    |    |    |     |    |    | 100 | b1  | 46 | 75
(3 rows)

相关链接

SELECT