当前位置: 首页 > 面试题库 >

CROSS JOIN和一个FROM中的多个表有什么区别?

郎恺
2023-03-14
问题内容

有什么区别?

SELECT a.name, b.name
FROM a, b;

SELECT a.name, b.name
FROM a
CROSS JOIN b;

如果没有差异,那么为什么两者都存在?


问题答案:

第一个带逗号的是上个世纪的旧样式。

第二个使用CROSS JOIN的是新的ANSI JOIN语法。

而这两个查询确实会给出相同的结果。

它们都将表“ a”的每个记录链接到表“ b”的每个记录。
因此,如果表“ a”具有10行,而表“ b”具有100行。
那么结果将是10 * 100 = 1000条记录。

但是,为什么某些数据库管理系统中仍然存在第一种过时的样式?
主要是出于向后兼容性的原因,以便某些较旧的SQL不会突然中断。

如今,大多数SQL专家都会对仍然使用该过时的旧逗号语法的人不屑一顾。(尽管对于有意的笛卡尔积通常是可以原谅的)

ACROSS JOIN是笛卡尔积JOIN,缺少ON用于定义2个表之间关系的子句。

在ANSI JOIN语法中,还有外部连接:LEFT JOIN,RIGHT JOIN,FULL JOIN

和普通的JOIN,也就是INNER JOIN。

但是那些通常需要该ON子句,而CROSS JOIN则不需要。

以及使用不同JOIN类型的查询示例

SELECT *
FROM jars
JOIN apples ON apples.jar_id = jars.id
LEFT JOIN peaches ON peaches.jar_id = jars.id
CROSS JOIN bananas AS bnns
RIGHT JOIN crates ON crates.id = jars.crate_id
FULL JOIN nuts ON nuts.jar_id = jars.id
WHERE jars.name = 'FruityMix'

JOIN语法的好处是链接条件和搜索条件是分开的。

在旧的逗号样式中,这种区别将很难被注意到。因此,忘记链接条件会更容易。

SELECT *
FROM crates, jars, apples, peaches, bananas, nuts
WHERE apples.jar_id = jars.id
  AND jars.name = 'NuttyFruitBomb'
  AND peaches.jar_id = jars.id(+)
  AND crates.id(+) = jar.crate_id;

您是否注意到第一个查询具有1个笛卡尔乘积,而第二个查询具有2个?这就是为什么第二个很坚果。



 类似资料:
  • “Kafka spout”和“Kafka Consumer”都从Kafka经纪人那里检索数据,到目前为止我知道的spout是用来与Storm通信的,而Consumer是用来与其他任何东西通信的。 --但是,技术上的区别是什么? -或者,如果我使用Consumer提取数据,然后使用“Storm Spout”接收数据,和如果我只是使用“Kafka Spout”,然后将其添加到我的Storm拓扑构建器的

  • 我正在运行一个启用缓存的多模块gradle构建。例如,一些任务说<code>是最新的 和

  • 在调试和故障处理的时候,我们通常有必要知道 RDD 有多少个分区。这里有几个方法可以找到这些信息: 使用 UI 查看在分区上执行的任务数 当 stage 执行的时候,你可以在 Spark UI 上看到这个 stage 上的分区数。 下面的例子中的简单任务在 4 个分区上创建了共 100 个元素的 RDD ,然后在这些元素被收集到 driver 之前分发一个 map 任务: scala> val s

  • 问题内容: 之间有什么区别 和 我不太明白。此方法不等待先前提交的任务完成执行。这是否意味着可以终止已提交但尚未完成的任务?我尝试了一些例子,他们没有证明,请给我一个例子。 问题答案: 你应该先打电话。否则,您可能会等待很长时间,因为实际上并没有关闭执行程序。 如果您要等待任务完成而不是等待执行程序关闭,则应使用。

  • 我知道这两个操作都是对表中的一列执行的,但每个操作有什么不同。

  • 我有两个表用于我的在线订单:product\u items 产品项包含销售价格、数量和成本价格。订单表包括成本、装运和货币 我想获得所有订单(按货币分组)的所有销售价格(*数量)和成本价格(*数量)以及成本装运的总和 问题是,当我将成本加起来时,订单中每个项目的成本加起来(因为它们是合并的) 因此,如果订单1有2个项目,运费为10欧元,那么它将退回20欧元。 如果我不加运费,那么我只得到最后一个值