交叉连接在两组元组上执行笛卡尔积.
SELECT * FROM Table1 CROSS JOIN Table2
哪种情况下这样的SQL操作特别有用?
如果您想要完全填充"网格",例如特定服装的尺寸和颜色信息:
select size, color from sizes CROSS JOIN colors
也许你想要一个包含当天每分钟行的表,并且你想用它来验证每分钟执行一个过程,所以你可能会跨越三个表:
select hour, minute from hours CROSS JOIN minutes
或者,您有一组标准报告规范要应用于一年中的每个月:
select specId, month from reports CROSS JOIN months
将这些视为视图的问题在于,在大多数情况下,您不需要完整的产品,特别是衣服方面.您可以MINUS
向查询添加逻辑以删除某些您没有携带的组合,但您可能会发现以其他方式填充表格更容易,而不是使用笛卡尔积.
此外,您最终可能会在可能比您想象的行数多一些的表上尝试交叉连接,或者您的WHERE
子句可能部分或完全丢失.在这种情况下,您的DBA会立即通知您遗漏.通常他或她会不高兴.
生成用于测试的数据.
对于大多数数据库查询,您通常不需要完整的笛卡尔积.关系数据库的全部功能是您可以应用您可能感兴趣的任何限制,以避免从数据库中删除不必要的行.
我想你可能想要的一个人为的例子是,如果你有一张员工表和一份需要做的工作表,并希望看到一个员工对一个工作的所有可能的任务.
好吧,这可能不会回答这个问题,但是,如果它是真的(我甚至不确定),这是一段有趣的历史.
在Oracle的初期,一个开发人员意识到,他需要重复每行的表(例如,它可能是事件的表,他需要去改变它分开"开始事件"和"结束事件"项).他意识到,如果他只有两个行的表,他可以做一个交叉连接,只选择第一个表中的列,并得到完全有他所需要的.所以他创造了一个简单的表,他自然而然地称之为"DUAL".
后来,他需要做的是这只能通过选择来完成从一个表,尽管行动本身无关,与表,(也许他忘了他的手表,想读通过SELECT SYSDATE从时间..他意识到他仍然躺着他的DUAL桌子,然后用它.过了一会儿,他厌倦了看到打印两次的时间,所以他最终删除了其中一行.
Oracle的其他人开始使用他的表,最终决定将其包含在标准的Oracle安装中.
这就解释了为什么一个表的唯一意义是它有一行的表有一个名字,意思是"两个".
关键是"向我展示所有可能的组合".我已将这些与其他计算字段结合使用,然后对其进行排序/过滤.
例如,假设您正在构建套利(交易)应用程序.您有卖家以实惠的价格提供产品,买家需要付费购买产品.您在产品密钥上进行交叉连接(以匹配潜在的买方和卖方),计算成本和价格之间的差价,然后对desc进行排序.在此,给你(中间人)最有利可图的交易来执行.当然,你几乎总是会有其他的边界过滤标准.