我一直在使用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