我一直在使用sql很长一段时间,但我现在在Databricks中工作,并且我得到了一个非常奇怪的结果。我有一个名为block_durations的表,其中包含一组ids(称为block_ts),并且我有另一个名为mergetable的表,我想要将它加入到该表中。合并表由acct_id和block_ts建立索引,因此它对每个block_ts有许多不同的记录。我想保留block_durations中不匹配的行,并且如果在mergetable中有多个匹配,我希望在结果连接中有多个相应的条目,就像您从左连接期望的那样。为什么LEFT JOIN删除行?
但是这没有发生。为了演示这一点,我在显示加入可合并的结果后,对单个acct_id进行过滤,以便每个block_ts最多有一个匹配项。
select count(*) from mergetable where acct_id = '0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98'
select count(*) from block_durations
select count(*) from
(
SELECT
mt.*,
bd.block_duration
FROM
block_durations bd
left outer JOIN mergetable mt
ON mt.block_ts = bd.block_ts
where acct_id='0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98'
) countTable
正如你所看到的,即使block_durations中有> 80000条记录,其中大部分记录都在左连接中丢失。这是为什么发生?我认为左连接的重点在于保留左表的不匹配行。这正是我期望从内部连接中获得的行为 - 实际上,当我切换到内部连接时,没有任何更改。
有人能帮我弄清楚发生了什么事吗?
- 保罗
'WHERE'仍在工作。 'NULL ='0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98'' => UNKNOWN,行被排除在结果集 – lad2025
不知道我看到你的观点了吗?我展示了对acct_id进行过滤后发生的情况 - 我们有16000行。之后,它应该被加入到一个80000行的表格中,其中16000个匹配。但结果应该仍然是80000行...... – Paul
啊......或许我确实看到了你的观点。我需要添加“或acct_id为空”?或者可选地过滤子查询中的可合并? – Paul