1. 程式人生 > >SQL Server中的交叉連線(cross join)

SQL Server中的交叉連線(cross join)

零、碼仙勵志

太在意別人的看法,最後會有兩種結局:要麼自己累死,要麼讓別人整死

一、建庫和建表

create database scort
use scort
create table emp
(
	empno int primary key,
	ename nvarchar(10),
	sal int,
	deptno int
)
insert into emp values (7369,'smith',3000,20);
insert into emp values (7499,'allen',1500,50);
insert into emp values (7566,'jones',2000,30);
insert into emp values (7654,'martin',5000,10);
insert into emp values (7698,'blake',1800,30);
 
create table dept
(
	deptno int primary key,
	dname nvarchar(10),
	loc nvarchar(10)
)
insert into dept values (10,'accounting','new york');
insert into dept values (20,'research','dallas');
insert into dept values (30,'sales','chicago');
insert into dept values (40,'operations','boston');
 
create table salgrade
(
	grade int primary key,
	lostl int,
	hisal int
)
insert into salgrade values (1,700,1200);
insert into salgrade values (2,1201,1400);
insert into salgrade values (3,1401,2000);
insert into salgrade values (4,2001,3000);
insert into salgrade values (5,3001,6000);

 二、交叉連線的用法

解釋:

除了在FROM子句中使用逗號間隔連線的表外,SQL還支援另一種被稱為交叉連線的操作,它們都返回被連線的兩個表所有資料行的笛卡爾積,返回到的資料行數等於第一個表中符合查詢條件的資料行數乘以第二個表中符合查詢條件的資料行數。惟一的不同在於,交叉連線分開列名時,使用CROSS JOIN關鍵字而不是逗號。

兩張表連線:

select * from emp,dept 
	where emp.deptno=dept.deptno
--等價於
select * from emp cross join dept
	where emp.deptno=dept.deptno

三張表連線:

select * from emp,dept,salgrade 
	where emp.deptno=dept.deptno and
	(emp.sal>salgrade.lostl and emp.sal<salgrade.hisal)
--等價於
select * from emp "E" 
	cross join dept "D" 
	cross join salgrade "S"
	where "E".deptno="D".deptno and
	("E".sal>"S".lostl and "E".sal<"S".hisal)