SQL联接查询

1、内联接(inner join)。

内联接,显示连接表都有的记录,并按最多记录子表显示最终结果。

1 select * from table1 a
2 inner join table2 b on a.Id = b.Id
3 where a.field...

 

2、外联接(outer join)。

外联接,又分为左联接(left join)和右联接(right join),显示主表所有记录,而子没有相关记录部分返回‘NULL’。outer join默认为左联接。

1 select * from table1 a
2 left join table2 b on a.Id = b.Id   --显示table1的所有记录,table2不存在记录部分返回NULL
3 
4 select * from table1 a
5 right join table2 b on a.Id = b.Id --显示table2的所有记录,table1不存在记录部分返回NULL 

如果我们把两表的所有记录都显示出来,以查看哪些表不存在记录,可以使用完整外部联接(full outer join)。

1 select * from table1 a
2 full outer join table2 b on a.Id = b.Id --返回两表的所有记录,两表互不存在的记录部分返回Null 

联接类型

保留数据行

A left outer join B

all A rows

A right outer join B

all B rows

A full outer join B

all A and B rows

 

3、交叉联接(Cross join)。

返回两个表的笛卡尔积(M * N 行记录)。效率低下,使用范围小。

1 select * from table1
2 cross join table2

 

4、表值内联(Cross apply)。

其实跟inner join差不多,只不过联接部分是function返回值的集合。

 1 CREATE FUNCTION dbo.fn_Apply(@sID int)
 2 RETURNS @Apply TABLE (cName nvarchar(50), major nvarchar(50))
 3 AS
 4 BEGIN
 5   INSERT @Apply SELECT cName, major FROM Apply where [sID] = @sID
 6   RETURN    
 7 END
 8  
 9 ---- Student cross apply function fn_Apply.
10 SELECT Student.sName, Student.GPA, Student.sizeHS,
11 cName, major 
12 FROM Student CROSS APPLY dbo.fn_Apply([sID])

 

5、表值外联(Outer apply)。

跟outer join差不多,跟cross apply差不多。

1 SELECT Student.sName, Student.GPA, Student.sizeHS,
2 cName, major 
3 FROM Student OUTER APPLY dbo.fn_Apply([sID])

 

 

posted @ 2012-09-03 09:23  Sprite.z  Views(173)  Comments(0Edit  收藏  举报