|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
一、先来谈谈θ 联接。
θ 联接用于多表联接查询。通过WHERE子句给出表与表之间的联接条件(而不是筛选记录的条件)
语法:
SELECT column1 [,column2 ……]
FROM table1,table2 [,table3……]
WHERE join_condition1 [{AND|OR} join_condition2] ……
既然是join_conditions 具体的形态就是 table1_column <operator> table1_column, 运算符通常是等号(=),即相等联接(equi-join)。
ANSI 并未将θ 联接归入2003新标准,被认为是旧的联接形式。标准规定显式指出联接类型和联接条件的语法结构:
SELECT column1 [,column2 ……]
FROM table1
[INNER|LEFT|RIGHT] JOIN table2
ON join_condition1
[INNER|LEFT|RIGHT] JOIN table3
ON join_condition2
……
通过ADO或OLE DB接口访问Microsoft JET数据库引擎 的EXCEL-SQL变形支持了ANSI标准。需用圆括号来逐层嵌套。
1. θ 联接 (theta join) 使用WHERE子句引入联接条件 (SQL-89 compliant syntax)
SELECT columns
FROM table1,table2
WHERE table1.column1=table2.column2
2. 变形的ANSI JOIN联接 (与ANSI语法有些不同,要用圆括号层层嵌套) (SQL-92 compliant syntax)
SELECT columns
FROM table1
INNER JOIN (table2
INNER JOIN (table3
INNER JOIN (table4
INNER JOIN ...)
ON table3.column3 op table4.column4)
ON table2.column2 op table3.column3)
ON table1.column1 op table2.column2
可以看出θ 联接联接语句简练。大多数OFFICE用户喜欢使用。
使用变形的ANSI JOIN联接,两三个表的联接还好对付,如果四个表及以上呢?极易眼花缭乱,导致括号放错位置,括号不匹配或不配对。
为什么简练的θ 联接没能纳入ANSI新标准呢?
原因有:1、WHERE子句通常引入的是筛选记录的条件,但θ 联接引入的是联接条件(也可引入筛选记录的条件,后面有例子。呵呵!同一个关键字WHERE竟然可以引入逻辑上完全不同的条件)
2、有些数据库平台不支持θ 联接
3、没有显式指出联接类型
假设两个表x, y,下面这个θ 联接语句
SELECT *
FROM x,y
两个表到底是怎么样的联接呢?
好了。正式引入第2个话题:交叉联接。
二、交叉联接
维基百科里采用扑克牌解释,很容易理解。引用如下:
“具体的说,如果集合 X 是 13 个元素的点数集合 { A, K, Q, J, 10, 9, 8, 7, 6, 5, 4, 3, 2 } 而集合 Y 是 4 个元素的花色集合 {♠, ♥, ♦, ♣},则这两个集合的笛卡儿积是 52 个元素的标准扑克牌的集合 { (A, ♠), (K, ♠), ..., (2, ♠), (A, ♥), ..., (3, ♣), (2, ♣) }”
换一种说法:X表有13条记录(行),Y表有4条记录(行),交叉联接后的结果集中有52(=13*4)条记录。
θ 联接的SQL语句
SELECT *
FROM x,y
CROSS JOIN 的ANSI语句在EXCEL中不予支持
SELECT *
FROM x CROSS JOIN y 在EXCEL中无法运行。
再来看看θ 联接:
SELECT columns
FROM table1,table2
WHERE table1.column1=table2.column2
如果WHERE子句引入的联接条件没处理好,一种极端情况就是相当于没有WHERE子句:
SELECT columns
FROM table1,table2
是不是跟上面的交叉联接语句
SELECT *
FROM x,y
有一比?
某一公司在一段时期内的进进出入的Transaction表或视图将有成千上万条记录,公司再大些、业务量更多些或时间段更长些,记录数是很可观的。这种情况是普遍的。如果这些表或视图产生交叉连接,所产生的巨量结果集不可想像,那就够服务器一心一意地来忙活一阵。所以交叉联接在大型关系型数据库中是非常忌讳的。
不过对于排列组合之类的需求,交叉联接提供了一种除VBA另一解决思路。
具体应用见:
“Excel能实现这样的分配么?”
http://club.excelhome.net/viewth ... d=369907#pid3634601
说明:
语句中 WHERE A.A球+ B.B球+ C.C球=100
这个WHERE子句引入的是交叉联接之后,筛选记录(行)的条件
俺学习SQL才三四个月,难免没说对、没说到位,欢迎指正补充! |
|