问题标签 [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.
sql - GROUP BY 交叉应用
让我们有两张桌子
然后是以下查询
返回预期结果如下
但是,当我添加group by A.fkb
到交叉应用时,B
对应的行A.fkb
不存在,消失了。
我在 SQL Server 和 PostgreSQL 上进行测试(用cross join lateral
而不是cross apply
)。为什么group by
会使行消失?似乎cross apply
在第一种情况下表现为外连接,在后一种情况下表现为内连接。但是,我不清楚为什么。
apache-spark - 加入横向视图 爆炸 Spark1 与 Spark2
如果我在 spark 1.6 中运行以下命令,它可以正常工作,但在 spark 2.2 中我收到以下错误。任何人都知道为什么以及如何修复语法?
我在想我可以通过使用一个表格来解决它,只为爆炸值并加入它,但想知道为什么它不再起作用或有任何更好的想法。
sql - PostgreSQL 在所有情况下都左连接横向输出
我想复制一些符合以下条件的行:
因为b = 'some_value'
,我想复制一个输出的行e
,另一个-e
;对于 b = "other_value",想要输出e
.
上面的查询给出了null
when b
is not 'some_value'
。我知道这是预期的行为,但如何在所有情况下输出一些东西?
目前我得到:
我想看看:
apache-drill - Apache Drill:在子查询中为横向连接提供限制不会返回正确的结果
我正在尝试使用 a 创建一个简单的查询,inner lateral join
但我想将连接限制为子查询中的单个结果
该BRANCH_DISTANCE
表包含任何两个分支之间的距离,我想返回100 km
另一个分支内的所有分支,这就是为什么在子查询中,只要有一条记录包含该分支并且其距离小于 100,它应该返回分支(并停止寻找任何进一步的匹配)。
但是当我添加限制时,查询只返回一条记录。取消限制后,将返回大约 2000 条记录。
如果我用 替换select b.CODE
,select distinct b.CODE
得到大约 500 个结果(这是正确的答案)。
我的目标是不在distinct
select 语句中使用关键字,这就是为什么我在子查询中添加限制,以便不会对BRANCH_DISTANCE
包含分支代码和距离 < 100 的表中的每条记录进行连接(因为它是一个分支可能与多个分支之间的距离小于 100 公里)。
sql - 与 group by 一起使用时,cross apply 的行为很奇怪
我不明白为什么在这种情况下列correct
和incorrect
具有不同的值。老实说 - 这是有效的 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
postgresql - 带有横向连接(大表和小表)的 PostgreSQL 规划器
我相信这两个查询具有相同的输出
我的问题是为什么规划者不测试这两种变体并选择最有效的一种?
postgresql - CROSS JOIN 可以“隐式横向”吗?
假设以下,相当简单的数据库:
所以我们有下表:
现在我看到了这样的查询:
返回以下结果:
我的问题是我不明白这里发生了什么。一方面,这看起来像一个LATERAL
连接,因为右侧
JOIN
指的是左侧,结果是完全合乎逻辑的。另一方面,手册是这样说的:
(没有
LATERAL
,每个子项SELECT
都是独立评估的,因此不能交叉引用任何其他FROM
项目。)
还有这个:
列源表必须是
INNER
或LEFT
加入到LATERAL
项目 […]
(见这里),当然CROSS JOIN
不会返回n × m
行(如本页所述)。
我的问题是:上面的查询结果与手册不矛盾吗?如果不是,这是否意味着JSONB_EACH
以某种方式受到特殊对待?(我会感到惊讶。)
sql - PostgreSQL 根据国家表解析国家/地区
我们有内容和国家/地区表。 国家非常简单:国家名称列定义为字符串:阿尔巴尼亚、比利时、中国、丹麦等...
内容是一个包含 50 万行的表格,其中包含各种数据,国家列定义为数组 text[]。每个值都有多个国家级联,例如:{"丹麦、芬兰、法国、德国、爱尔兰、英国、意大利、荷兰、波兰、俄罗斯、西班牙、瑞典、澳大利亚、巴西、加拿大、中国、印度、印度尼西亚、日本,马来西亚,越南,墨西哥,"韩国",泰国,美国,新加坡,阿联酋"}
来自内部团队的更新是针对一千条记录,我们不确定国家/地区是否都拼写正确。因此,任务是与国家表中的 country_name 进行核对。
我正在做replace(replace(country_array::text,'{',''),'}','') as country_text
并考虑做 UNPIVOT 来检查国家表的每一列。是否有任何其他更简单的方法来确保 Content 表中的国家/地区数组具有来自国家/地区表的有效国家/地区名称?
谢谢
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)
,我得到了这种输出:
google-bigquery - 有没有办法用 BigQuery 做 LEFT JOIN LATERAL?
给定一些具有重复name
s 和不同s 的行,如果重复出现在第一个 45 分钟内timestamp
,我想选择最新的行。timestamp
name
timestamp
这是在 PostgreSQL 中起作用的:
很好的解释LATERAL
:
https ://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 的中间行):