Sql 为什么左连接删除行?

Sql 为什么左连接删除行?,sql,Sql,我已经使用sql很长一段时间了,但我现在在Databricks中工作,我得到了一个非常奇怪的结果。我有一个名为block_durations的表,其中包含一组ID(称为block_ts),还有一个名为mergetable的表,我想将其左键连接到该表。Mergetable由acct_id和block_ts索引,因此每个block_ts都有许多不同的记录。我希望在block_durations中保留不匹配的行,如果Mergetable中有多个匹配项,我希望结果联接中有多个对应项,正如您从左联接中所期

我已经使用sql很长一段时间了,但我现在在Databricks中工作,我得到了一个非常奇怪的结果。我有一个名为block_durations的表,其中包含一组ID(称为block_ts),还有一个名为mergetable的表,我想将其左键连接到该表。Mergetable由acct_id和block_ts索引,因此每个block_ts都有许多不同的记录。我希望在block_durations中保留不匹配的行,如果Mergetable中有多个匹配项,我希望结果联接中有多个对应项,正如您从左联接中所期望的那样

但这并没有发生。为了演示这一点,我将在过滤单个帐户id后显示加入mergetable的结果,以便每个块最多有一个匹配项

select count(*) from mergetable where acct_id = '0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98'
16579

82817

16579

正如您所看到的,尽管在block_持续时间中有80000条以上的记录,但大多数记录在左连接中丢失。为什么会这样?我认为左联接的全部意义在于保留左表中不匹配的行。这正是我期望从内部连接中得到的行为——事实上,当我切换到内部连接时,没有任何变化

有人能帮我弄清楚发生了什么事吗


-Paul

连接左侧的所有行都将被保留,但稍后您将对删除的与该条件不匹配的行运行
WHERE…
条件

将您的
WHERE
条件合并到
JOIN
条件中:

SELECT 
mt.*,
bd.block_duration
FROM
block_durations bd
left outer JOIN mergetable mt
  ON mt.block_ts = bd.block_ts AND acct_id='0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98'
您还可以在对结果运行
JOIN
之前过滤
mergetable

SELECT 
mt.*,
bd.block_duration
FROM
block_durations bd
left outer JOIN (SELECT * FROM mergetable WHERE acct_id='0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98') mt
  ON mt.block_ts = bd.block_ts

联接左侧的所有行都将保留,但稍后您将对删除的与条件不匹配的行运行
WHERE…
condition

将您的
WHERE
条件合并到
JOIN
条件中:

SELECT 
mt.*,
bd.block_duration
FROM
block_durations bd
left outer JOIN mergetable mt
  ON mt.block_ts = bd.block_ts AND acct_id='0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98'
您还可以在对结果运行
JOIN
之前过滤
mergetable

SELECT 
mt.*,
bd.block_duration
FROM
block_durations bd
left outer JOIN (SELECT * FROM mergetable WHERE acct_id='0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98') mt
  ON mt.block_ts = bd.block_ts

其中
仍在工作<代码>NULL='0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98'=>未知且行已从结果中排除我不确定是否明白您的观点?我展示了过滤该帐户id后发生的情况——我们有16000行。在之后,它应该连接到一个有80000行的表,其中16000行是匹配的。但结果应该仍然是80000行……啊。。。或许我明白你的意思。我需要添加“或帐户id为空”?或者在子查询中过滤合并表?结果是925000。仍然比我想象的要少——大约有80000个帐户id和70000个区块id。我认为这将为每个帐户id提供70000个结果,其中仍在工作<代码>NULL='0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98'=>未知且行已从结果中排除我不确定是否明白您的观点?我展示了过滤该帐户id后发生的情况——我们有16000行。在之后,它应该连接到一个有80000行的表,其中16000行是匹配的。但结果应该仍然是80000行……啊。。。或许我明白你的意思。我需要添加“或帐户id为空”?或者在子查询中过滤合并表?结果是925000。比我想象的还要少——大约有80000个账户id和70000个区块id。我想每个账户id会有70000个结果?谢谢你的回答。我有点不好意思说我没看到这个谢谢你的回答。我有点不好意思说我没有看到这个