当前位置:  开发笔记 > 数据库 > 正文

交叉连接有什么用途?

如何解决《交叉连接有什么用途?》经验,为你挑选了5个好方法。

交叉连接在两组元组上执行笛卡尔积.

SELECT *
FROM Table1
CROSS JOIN Table2

哪种情况下这样的SQL操作特别有用?



1> Dave DuPlant..:

如果您想要完全填充"网格",例如特定服装的尺寸和颜色信息:

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会立即通知您遗漏.通常他或她会不高兴.


_...在这种情况下,您的DBA会及时通知您遗漏.通常他或她都不会高兴._ ...哈哈,真实!
@Dave:不是第二个例子只是小时CROSS JOIN分钟?

2> Ovidiu Pacur..:

生成用于测试的数据.



3> Randy..:

对于大多数数据库查询,您通常不需要完整的笛卡尔积.关系数据库的全部功能是您可以应用您可能感兴趣的任何限制,以避免从数据库中删除不必要的行.

我想你可能想要的一个人为的例子是,如果你有一张员工表和一份需要做的工作表,并希望看到一个员工对一个工作的所有可能的任务.



4> James Curran..:

好吧,这可能不会回答这个问题,但是,如果它是真的(我甚至不确定),这是一段有趣的历史.

在Oracle的初期,一个开发人员意识到,他需要重复每行的表(例如,它可能是事件的表,他需要去改变它分开"开始事件"和"结束事件"项).他意识到,如果他只有两个行的表,他可以做一个交叉连接,只选择第一个表中的列,并得到完全有他所需要的.所以他创造了一个简单的表,他自然而然地称之为"DUAL".

后来,他需要做的是这只能通过选择来完成从一个表,尽管行动本身无关,与表,(也许他忘了他的手表,想读通过SELECT SYSDATE从时间..他意识到他仍然躺着他的DUAL桌子,然后用它.过了一会儿,他厌倦了看到打印两次的时间,所以他最终删除了其中一行.

Oracle的其他人开始使用他的表,最终决定将其包含在标准的Oracle安装中.

这就解释了为什么一个表的唯一意义是它有一行的表有一个名字,意思是"两个".



5> Kevin Dostal..:

关键是"向我展示所有可能的组合".我已将这些与其他计算字段结合使用,然后对其进行排序/过滤.

例如,假设您正在构建套利(交易)应用程序.您有卖家以实惠的价格提供产品,买家需要付费购买产品.您在产品密钥上进行交叉连接(以匹配潜在的买方和卖方),计算成本和价格之间的差价,然后对desc进行排序.在此,给你(中间人)最有利可图的交易来执行.当然,你几乎总是会有其他的边界过滤标准.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有