交叉join有什么用途?
交叉连接对两组元组执行笛卡尔乘积。
SELECT * FROM Table1 CROSS JOIN Table2
哪种情况使得这样的SQL操作特别有用?
如果你有一个你想完全填充的“网格”,比如某件衣服的尺寸和颜色信息:
select size, color from sizes CROSS JOIN colors
也许你想要一个包含一天中每一分钟的行的表,并且你想用它来validation一个过程每分钟执行一次,所以你可能会跨越三个表:
select hour, minute from hours CROSS JOIN minutes
或者你有一套标准的报告规范,你想申请到每年的一年:
select specId, month from reports CROSS JOIN months
把这些看作是观点的问题是,在大多数情况下,你不需要一个完整的产品,特别是在衣服方面。 您可以将MINUS
逻辑添加到查询中以删除某些不包含的组合,但是您可能会发现以其他方式填充表格并且不使用笛卡尔产品会更容易。
另外,你最终可能会尝试交叉连接,这些连接可能比你想象的还要多行,或者你的WHERE
子句部分或完全丢失。 在这种情况下,您的DBA将立即通知您这一遗漏。 通常他或她不会高兴。
对于大多数数据库查询,通常不需要完整的笛卡尔产品。 关系数据库的全部function是,你可以应用你可能感兴趣的任何限制,以避免从数据库中拉出不必要的行。
我想你可能想要一个人为的例子,那就是如果你有一张雇员表和一张需要做的工作表,并且希望看到一个雇员的所有可能的工作分配给一份工作。
好吧,这可能不会回答这个问题,但是,如果这是真的(我甚至不确定),这是一个有趣的历史。
在Oracle初期,其中一位开发人员意识到他需要复制表格中的每一行(可能这是一个事件表,他需要将其更改为“开始事件”和“结束事件”)。 他意识到,如果他只有两排桌子,他可以进行交叉连接,只select前两列中的列,然后得到他所需要的。 所以他创造了一个简单的桌子,他自然就称之为“DUAL”。
后来,他需要做一些事情,只能通过表格中的select来完成,即使动作本身与表格无关,(也许他忘记了自己的手表,并希望通过SELECT SYSDATE FROM来读取时间。 )他意识到他仍然有他的DUAL桌子躺着,并用它。 过了一会儿,他厌倦了看到两次打印的时间,所以他最终删除了其中的一行。
Oracle的其他人开始使用他的表格,最终决定将其包含在标准的Oracle安装中。
这就解释了为什么一张只有一行的表格有一个名字,意思是“两个”。
生成数据进行testing。
采取类似于数字表的东西,其中有10行数字0-9。 您可以在该表上多次使用交叉连接来获得需要多行的结果,并将结果进行适当的编号。 这有很多用途。 例如,可以将它与datadd()函数结合使用,以便在给定年份的每一天获得一个集合。
关键是“向我展示所有可能的组合”。 我已经使用这些与其他计算字段,然后sorting/过滤这些。
例如,假设您正在build立套利(交易)应用程序。 你有卖家提供产品的价格和买家要求产品的成本。 您对产品密钥进行交叉连接(以匹配潜在的买家和卖家),计算成本和价格之间的价差,然后对desc进行sorting。 在这给你(中间人)最有利可图的交易执行。 几乎总是你会有其他的边界过滤标准当然。
这是使用交叉连接创build交叉表报告的有趣方式。 我在Joe Celko的SQL Smarties中find了它,并多次使用它。 这需要一些设置,但是值得花费时间。
想象一下,你有一系列的问题,你想问题的具体项目和date组合(价格,可用性等)。 您可以将项目和date加载到单独的临时表中,并使查询交叉连接表。 这可能比枚举IN子句中的项目和date更为方便,尤其是因为某些数据库限制了IN子句中元素的数量。