ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 15596|回复: 13

[原创] 【SQL】θ联接(Theta Join)和交叉联接(Cross Join)一起谈

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-3-23 11:21 | 显示全部楼层 |阅读模式
一、先来谈谈θ 联接。

θ 联接用于多表联接查询。通过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 个元素的花色集合 {&#9824;, &#9829;, &#9830;, &#9827;},则这两个集合的笛卡儿积是 52 个元素的标准扑克牌的集合 { (A, &#9824;), (K, &#9824;), ..., (2, &#9824;), (A, &#9829;), ..., (3, &#9827;), (2, &#9827;) }”

换一种说法: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才三四个月,难免没说对、没说到位,欢迎指正补充!

TA的精华主题

TA的得分主题

发表于 2010-3-23 11:28 | 显示全部楼层
感谢楼主分享,先慢慢研究一下

TA的精华主题

TA的得分主题

发表于 2010-3-23 11:33 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-3-23 14:21 | 显示全部楼层
怎么只有楼上两位前来捧场呀? 是不是要弹一弹SELECT语句?

TA的精华主题

TA的得分主题

发表于 2010-3-23 14:23 | 显示全部楼层
前来捧场来了。才刚看到啊。

TA的精华主题

TA的得分主题

发表于 2010-3-28 17:10 | 显示全部楼层
原帖由 livewire 于 2010-3-23 14:21 发表
怎么只有楼上两位前来捧场呀?......


曲高和寡呵呵.赞一个

TA的精华主题

TA的得分主题

发表于 2010-5-16 17:16 | 显示全部楼层
我也来捧个场,首先来学习了。尤其是解决三色球组合问题印象深刻。
再请教楼主老师:如果把每组10个球换成每组10个人(球同色视同一样,每组出来的人不同看做不一样,复杂一些哈),这样能否用SQL类似的方法解决呢?

TA的精华主题

TA的得分主题

发表于 2010-7-21 23:51 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-7-22 08:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
前来学习受教,感谢楼主。这个内容好像是论坛中第一次看到,稀罕。

TA的精华主题

TA的得分主题

发表于 2010-7-22 08:24 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-13 04:19 , Processed in 0.038835 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表