我想在兩列格式不同的表上進行左連接。我使用 REPLACE 來洗掉“[]”,但我無法將其中一行變成兩行,因此無法完成連接。
emp_tbl state_tbl
emp state id name
-------- ------- ------ -----
| Steve | [1] | | 1 | AL |
| Greg | [2|3] | | 2 | NV |
| Steve | [4] | | 3 | AZ |
-------- ------- | 4 | NH |
------ -----
Desired output:
-------- ------
| Steve | AL |
| Greg | NV |
| Greg | AZ |
| Steve | NH |
-------- ------
SELECT emp_tbl.emp, state_tbl.name
FROM emp_tbl
LEFT JOIN state_tbl on state_tbl.id = REPLACE(REPLACE(emp_tbl.state, '[', ''), ']', '')
通過此查詢,我可以洗掉“[]”并進行連接,但是具有兩個“狀態”的行顯然不起作用。
uj5u.com熱心網友回復:
您的查詢永遠不會產生 4 行,因為左表只有 3 行。您需要在連接之前展平包含多個 state_id 的行。
- 準備表和資料:
create or replace table emp_tbl (emp varchar, state string);
create or replace table state_tbl (id varchar, name varchar);
insert into emp_tbl values
('Steve', '[1]'), ('Greg', '[2|3]'), ('Steve', '[4]');
insert into state_tbl values
(1, 'AL'), (2, 'NV'), (3, 'AZ'), (4, 'NH');
- 然后下面的查詢應該給你你想要的資料:
with emp_tbl_tmp as (
select emp, parse_json(replace(state, '|', ',')) as states from emp_tbl
),
flattened_tbl as (
select emp, value as state_id from emp_tbl_tmp, table(flatten(input => states))
)
select emp, name from flattened_tbl emp
left join state_tbl state on (emp.state_id = state.id);
或者,如果您想保存一個步驟:
with flattened_emp_tbl as (
select emp, value as state_id
from emp_tbl,
table(flatten(
input => parse_json(replace(state, '|', ','))
))
)
select emp, name from flattened_emp_tbl emp
left join state_tbl state
on (emp.state_id = state.id);
uj5u.com熱心網友回復:
這是您的方法:
select emp_tbl.emp, state_tbl.name
from emp_tbl tw
lateral flatten (input=>split(parse_json(tw.state), '|')) s
left join state_tbl on s.value = state_tbl.id
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/354202.html
