2017-08-26 89 views
0

我一直在使用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条记录,其中大部分记录都在左连接中丢失。这是为什么发生?我认为左连接的重点在于保留左表的不匹配行。这正是我期望从内部连接中获得的行为 - 实际上,当我切换到内部连接时,没有任何更改。

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

- 保罗

+3

'WHERE'仍在工作。 'NULL ='0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98'' => UNKNOWN,行被排除在结果集 – lad2025

+0

不知道我看到你的观点了吗?我展示了对acct_id进行过滤后发生的情况 - 我们有16000行。之后,它应该被加入到一个80000行的表格中,其中16000个匹配。但结果应该仍然是80000行...... – Paul

+0

啊......或许我确实看到了你的观点。我需要添加“或acct_id为空”?或者可选地过滤子查询中的可合并? – Paul

回答

2

所有的左侧行的联接将被保留,但后来你运行上可以除去不符合条件的行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' 

您还可以过滤mergetable你运行结果JOIN前:

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 
+0

感谢您的回答。我有点尴尬地说,我没有看到这一点 – Paul