2017-08-26 85 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