外连接(+)
功能描述
Vastbase在Oracle兼容模式下支持外连接功能,且从Build 14开始支持使用(+)实现如下特性:
一表对多的连接特性,即单表不同字段外连接不同表的不同字段。
多对多表的连接特性,即多表相互连接。如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、创建测试表并插入数据。
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)
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)
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)
相关链接