34,588
社区成员
发帖
与我相关
我的任务
分享
declare @表A table (aID int,aNum varchar(9))
insert into @表A
select 1,'a20050111' union all
select 2,'a20050112' union all
select 3,'a20050113' union all
select 4,'a20050114' union all
select 5,'a20050115'
declare @表B table (bID int,bName varchar(12))
insert into @表B
select 1,'2006032401' union all
select 2,'2006032402' union all
select 3,'2006032403' union all
select 4,'2006032404' union all
select 8,'2006032408'
--左联等价于 left outer join (一个表的所有行和另一个表满足条件的行)
select * from @表A a left join @表B b on a.aID=b.bID;
/*
aID aNum bID bName
----------- --------- ----------- ------------
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
*/
--右联等价于 right outer join
select * from @表A a right join @表B b on a.aID=b.bID;
/*
aID aNum bID bName
----------- --------- ----------- ------------
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
*/
--笛卡尔乘积
select * from @表A a cross join @表B b;
/*
aID aNum bID bName
----------- --------- ----------- ------------
1 a20050111 1 2006032401
2 a20050112 1 2006032401
3 a20050113 1 2006032401
4 a20050114 1 2006032401
5 a20050115 1 2006032401
1 a20050111 2 2006032402
2 a20050112 2 2006032402
3 a20050113 2 2006032402
4 a20050114 2 2006032402
5 a20050115 2 2006032402
1 a20050111 3 2006032403
2 a20050112 3 2006032403
3 a20050113 3 2006032403
4 a20050114 3 2006032403
5 a20050115 3 2006032403
1 a20050111 4 2006032404
2 a20050112 4 2006032404
3 a20050113 4 2006032404
4 a20050114 4 2006032404
5 a20050115 4 2006032404
1 a20050111 8 2006032408
2 a20050112 8 2006032408
3 a20050113 8 2006032408
4 a20050114 8 2006032408
5 a20050115 8 2006032408
*/
--内联等价于 inner join
select * from @表A a join @表B b on a.aID=b.bID;
/*
aID aNum bID bName
----------- --------- ----------- ------------
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
*/
--外联
select * from @表A a full outer join @表B b on a.aID=b.bID;
/*
aID aNum bID bName
----------- --------- ----------- ------------
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
NULL NULL 8 2006032408
*/
JOIN连接组合两个表中的字段记录,包括三种:
INNER JOIN运算式:连接组合两个表中的字段记录。
LEFT JOIN运算式:连接组合两个表中的字段记录,并将包含了LEFT JOIN左边表中的全部记录。
RIGHT JOIN运算式:连接组合两个表中的字段记录,并将包含了RIGHT JOIN右边表中的全部记录。
INNER JOIN设定两个表相关连的运算式,以连接组合两个表中的字段记录。
INNER JOIN语法如下:
FROM 表1 INNER JOIN 表2 ON 表1.字段1 比较运算子 表2.字段2
两个表连接的字段,譬如 [表1.字段1=表2.字段2],必须具有相同的字段类型,但是字段名称不需要相同。
例如,自动编号字段类型可以连接Long 的字段类型,但是单精整数字段类型不能连接双精整数的字段类型。
比较运算子可为=、<、>、<=、>=、或<>。
JOIN连接的字段,不可以包含MEMO字段类型或OLE对象类型,否则会发生错误。
在一个JOIN表达式中,可以连结多个ON子句:
SELECT fields
FROM 表1 INNER JOIN 表2
ON 表1.字段1 比较运算子 表2.字段1 AND
ON 表1.字段2 比较运算子 表2.字段2) OR
ON 表1.字段3 比较运算子 表2.字段3)
JOIN表达式中,可以为巢状式:
SELECT fields
FROM 表1 INNER JOIN
(表2 INNER JOIN [( ]表3
[INNER JOIN [( ] 表x [INNER JOIN ...)]
ON 表3.字段3 比较运算子 表x.字段x)]
ON 表2.字段2 比较运算子 表3.字段3)
ON 表1.字段1 比较运算子 表2.字段2
在一个INNER JOIN中,可以包括巢状式的LEFT JOIN或RIGHT JOIN,但是在一个LEFT JOIN或RIGHT JOIN中不能包括巢状式的INNER JOIN。