问题标签 [lateral-join]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2236 浏览

sql - GROUP BY 交叉应用

让我们有两张桌子

然后是以下查询

返回预期结果如下

但是,当我添加group by A.fkb到交叉应用时,B对应的行A.fkb不存在,消失了。

我在 SQL Server 和 PostgreSQL 上进行测试(用cross join lateral而不是cross apply)。为什么group by会使行消失?似乎cross apply在第一种情况下表现为外连接,在后一种情况下表现为内连接。但是,我不清楚为什么。

0 投票
0 回答
554 浏览

apache-spark - 加入横向视图 爆炸 Spark1 与 Spark2

如果我在 spark 1.6 中运行以下命令,它可以正常工作,但在 spark 2.2 中我收到以下错误。任何人都知道为什么以及如何修复语法?

我在想我可以通过使用一个表格来解决它,只为爆炸值并加入它,但想知道为什么它不再起作用或有任何更好的想法。

0 投票
1 回答
132 浏览

sql - PostgreSQL 在所有情况下都左连接横向输出

我想复制一些符合以下条件的行:

因为b = 'some_value',我想复制一个输出的行e,另一个-e;对于 b = "other_value",想要输出e.

上面的查询给出了nullwhen bis not 'some_value'。我知道这是预期的行为,但如何在所有情况下输出一些东西?

目前我得到:

我想看看:

0 投票
1 回答
266 浏览

apache-drill - Apache Drill:在子查询中为横向连接提供限制不会返回正确的结果

我正在尝试使用 a 创建一个简单的查询,inner lateral join但我想将连接限制为子查询中的单个结果

BRANCH_DISTANCE表包含任何两个分支之间的距离,我想返回100 km另一个分支内的所有分支,这就是为什么在子查询中,只要有一条记录包含该分支并且其距离小于 100,它应该返回分支(并停止寻找任何进一步的匹配)。

但是当我添加限制时,查询只返回一条记录。取消限制后,将返回大约 2000 条记录。

如果我用 替换select b.CODEselect distinct b.CODE得到大约 500 个结果(这是正确的答案)。

我的目标是不在distinctselect 语句中使用关键字,这就是为什么我在子查询中添加限制,以便不会对BRANCH_DISTANCE包含分支代码和距离 < 100 的表中的每条记录进行连接(因为它是一个分支可能与多个分支之间的距离小于 100 公里)。

0 投票
0 回答
36 浏览

sql - 与 group by 一起使用时,cross apply 的行为很奇怪

我不明白为什么在这种情况下列correctincorrect具有不同的值。老实说 - 这是有效的 SQL 似乎很奇怪,因为该cross apply部分不是聚合函数,因为group by.

结果是:

但是当我确实删除了该group by部分并添加distinct以下内容时:

我确实得到以下结果:

这是我期望从incorrect第一个查询中的列得到的结果。

使用子句时是否对group by子句有不同的处理group by?到目前为止,我只认为它更像是一个带有子查询的智能连接。添加incorrect到该group by部分使其按应有的方式工作,没有它,行为就像第一个查询的结果中描述的那样。它编译、运行并返回一个有点随机的值。

编辑:数据库版本是Oracle Database 12c Enterprise Edition 12.1.0.2.0

0 投票
0 回答
89 浏览

postgresql - 带有横向连接(大表和小表)的 PostgreSQL 规划器

我相信这两个查询具有相同的输出

我的问题是为什么规划者不测试这两种变体并选择最有效的一种?

0 投票
1 回答
408 浏览

postgresql - CROSS JOIN 可以“隐式横向”吗?

假设以下,相当简单的数据库:

所以我们有下表:

现在我看到了这样的查询:

返回以下结果:

我的问题是我不明白这里发生了什么。一方面,这看起来像一个LATERAL连接,因为右侧 JOIN指的是左侧,结果是完全合乎逻辑的。另一方面,手册是这样说的:

(没有LATERAL,每个子项SELECT都是独立评估的,因此不能交叉引用任何其他FROM项目。)

还有这个:

列源表必须是INNERLEFT加入到LATERAL 项目 […]

(见这里),当然CROSS JOIN不会返回n × m 行(如本页所述)。

我的问题是:上面的查询结果与手册不矛盾吗?如果不是,这是否意味着JSONB_EACH以某种方式受到特殊对待?(我会感到惊讶。)

0 投票
2 回答
327 浏览

sql - PostgreSQL 根据国家表解析国家/地区

我们有内容和国家/地区表。 国家非常简单:国家名称列定义为字符串:阿尔巴尼亚、比利时、中国、丹麦等...

内容是一个包含 50 万行的表格,其中包含各种数据,国家列定义为数组 text[]。每个值都有多个国家级联,例如:{"丹麦、芬兰、法国、德国、爱尔兰、英国、意大利、荷兰、波兰、俄罗斯、西班牙、瑞典、澳大利亚、巴西、加拿大、中国、印度、印度尼西亚、日本,马来西亚,越南,墨西哥,"韩国",泰国,美国,新加坡,阿联酋"}

来自内部团队的更新是针对一千条记录,我们不确定国家/地区是否都拼写正确。因此,任务是与国家表中的 country_name 进行核对。

我正在做replace(replace(country_array::text,'{',''),'}','') as country_text并考虑做 UNPIVOT 来检查国家表的每一列。是否有任何其他更简单的方法来确保 Content 表中的国家/地区数组具有来自国家/地区表的有效国家/地区名称?

谢谢

0 投票
1 回答
72 浏览

postgresql - 从另一个表中选择随机 ID ....对 LATERAL JOIN 感到困惑

我试图掌握在 Postgres 中生成随机数据的方法,但发现我对LATERAL JOIN. 基于我之前获得的一些帮助,我有一些代码试图:

-- 生成一系列数字
-- 生成与数字序列匹配的小时的时间戳
-- 为每一行生成一个大致正态分布的随机(ish)分数
-- 从数据库中的表中随机选择一个 ID。

最后一点不起作用。当我运行下面显示的脚本时,我得到一个随机值facility_id,但每一行都有相同的随机值。我想要在每一行上分配的随机 ID,而不是在整个运行中全局分配一次。在程序性思维中,facility_id是在循环之前分配的,我希望它在循环中分配。我认为这LATERAL JOIN会帮助我在这里,但是

我认为子查询可能会起作用,但我还facility_id使用以下代码在所有行中获得了一个值:

我没有列出facility表定义,但上面唯一重要的字段是id,因此任何表都可以以相同的方式工作。

如果它对答案有任何影响,一旦我能找出解决这个问题的方法,我想使用facility_id每一行上的随机数作为输入,从另一个表中选择其他东西。

谢谢你的帮助。我正在为此努力,不仅是为了获得解决方案,而且是为了尝试更好地了解各种工具的工作原理。我(显然)还没有到可以阅读上述代码并在脑海中预测它的行为方式的地步。获得这种理解是我自己解决问题的基础。换句话说,我不仅在尝试解决这个问题,而且还在努力缩小我的心理差距。

过早的优化

我正在编辑我的问题,因为我需要发布更多代码。

哈!很高兴看到我不是唯一一个被指控存在过早优化问题的人;-) 可以肯定的是,这在设计或审查会议中可能会被激怒。

我认为您所展示的id是在表达式中使用的,这使得它的结果不确定。这就是我生活的地方,并重新学习我应该发布我的表格结构。我们的id字段是 UUID。我试图将在表达式中使用 UUID 的东西拼凑在一起,但它不会改变行为。

where left(id::text,1) <> 'X' -- prevent premature optimization

您描述的过早优化,以及打败它的解决方法,不是我可以预测的行为。因为缝隙。我试过用left表达式运行我的代码explain (costs off),我得到了这种输出:

0 投票
2 回答
2971 浏览

google-bigquery - 有没有办法用 BigQuery 做 LEFT JOIN LATERAL?

给定一些具有重复names 和不同s 的行,如果重复出现在第一个 45 分钟内timestamp,我想选择最新的行。timestampnametimestamp

这是在 PostgreSQL 中起作用的:

很好的解释LATERALhttps ://heap.io/blog/engineering/postgresqls-powerful-new-join-type-lateral

LATERAL join 类似于 SQL foreach 循环,其中 PostgreSQL 将遍历结果集中的每一行并使用该行作为参数评估子查询。

所以它就像一个相关的子查询,但是在连接中。

然后我只取没有更新时间戳(WHERE j.ts is NULL)的行。

如何在 BigQuery 中执行此操作?

编辑:我已经按照评论中的要求在SQLFiddle 上创建了一个 PostgreSQL 分组示例。

输入:

输出(删除了时间戳 23:58:31 的中间行):