使用相同 table 的雪花合并
Snowflake merge using same table
我有一个table,它的主键是1,另一列是卷号。
我想检查 table 中是否存在 id 值,如果是,更新其卷号。如果没有,请在 table.
中插入 id 和 roll number
我正在尝试使用合并来做到这一点。
parameters: id_value, roll_number
merge into "test_table" as t
using (SELECT * from "test_table" where id = id_value) as s
on t.id=s.id
when matched then
update set t.roll_number=5
when not matched then
insert (id, roll_number) values (id_value,roll_number);
它在值存在时起作用,它更新 table 但在插入的情况下不起作用。没有插入行。
当源和目标相同时table,如果它不存在于目标中,它就不会在源中。所以没有什么可插入的。
您应该可以使用如下所示的合并语句来执行此操作:
-- Set params first
set (id_value, roll_number) = (1, 5);
-- Run merge
merge into test_table
using (select
column1 as id,
column2 as roll_number
from
values ($id_value, $roll_number)) tt
on test_table.id = tt.id
when matched then update set test_table.roll_number = tt.roll_number
when not matched then insert (id, roll_number) values (tt.id, tt.roll_number);
完整示例:
-- Set up example table and insert values
create temporary table test_table
(
id number,
roll_number number
);
-- Insert some sample data
insert overwrite into test_table
values (1, 2),
(2, 1),
(3, 6);
-- Here is what the initial table looks like
select *
from test_table;
-- +--+-----------+
-- |ID|ROLL_NUMBER|
-- +--+-----------+
-- |1 |2 |
-- |2 |1 |
-- |3 |6 |
-- +--+-----------+
-- Set the parameters
set (id_value, roll_number) = (1, 5);
-- Run the merge statement using the parameters.
-- This should update the roll_number with ID of 1 to value 5.
merge into test_table
using (select
column1 as id,
column2 as roll_number
from
values ($id_value, $roll_number)) tt
on test_table.id = tt.id
when matched then update set test_table.roll_number = tt.roll_number
when not matched then insert (id, roll_number) values (tt.id, tt.roll_number);
-- Check what the table looks like now
select *
from test_table;
-- +--+-----------+
-- |ID|ROLL_NUMBER|
-- +--+-----------+
-- |1 |5 | <---- Updated row
-- |2 |1 |
-- |3 |6 |
-- +--+-----------+
-- Set the parameters to an id that doesn't exist in the table.
set (id_value, roll_number) = (4, 3);
-- Now the same merge statement should insert
-- a new record with ID 4 and roll_number 3.
merge into test_table
using (select
column1 as id,
column2 as roll_number
from
values ($id_value, $roll_number)) tt
on test_table.id = tt.id
when matched then update set test_table.roll_number = tt.roll_number
when not matched then insert (id, roll_number) values (tt.id, tt.roll_number);
-- Check what the table looks like now
select *
from test_table;
-- +--+-----------+
-- |ID|ROLL_NUMBER|
-- +--+-----------+
-- |4 |3 | <---- New row
-- |1 |5 |
-- |2 |1 |
-- |3 |6 |
-- +--+-----------+
我有一个table,它的主键是1,另一列是卷号。
我想检查 table 中是否存在 id 值,如果是,更新其卷号。如果没有,请在 table.
中插入 id 和 roll number我正在尝试使用合并来做到这一点。
parameters: id_value, roll_number
merge into "test_table" as t
using (SELECT * from "test_table" where id = id_value) as s
on t.id=s.id
when matched then
update set t.roll_number=5
when not matched then
insert (id, roll_number) values (id_value,roll_number);
它在值存在时起作用,它更新 table 但在插入的情况下不起作用。没有插入行。
当源和目标相同时table,如果它不存在于目标中,它就不会在源中。所以没有什么可插入的。
您应该可以使用如下所示的合并语句来执行此操作:
-- Set params first
set (id_value, roll_number) = (1, 5);
-- Run merge
merge into test_table
using (select
column1 as id,
column2 as roll_number
from
values ($id_value, $roll_number)) tt
on test_table.id = tt.id
when matched then update set test_table.roll_number = tt.roll_number
when not matched then insert (id, roll_number) values (tt.id, tt.roll_number);
完整示例:
-- Set up example table and insert values
create temporary table test_table
(
id number,
roll_number number
);
-- Insert some sample data
insert overwrite into test_table
values (1, 2),
(2, 1),
(3, 6);
-- Here is what the initial table looks like
select *
from test_table;
-- +--+-----------+
-- |ID|ROLL_NUMBER|
-- +--+-----------+
-- |1 |2 |
-- |2 |1 |
-- |3 |6 |
-- +--+-----------+
-- Set the parameters
set (id_value, roll_number) = (1, 5);
-- Run the merge statement using the parameters.
-- This should update the roll_number with ID of 1 to value 5.
merge into test_table
using (select
column1 as id,
column2 as roll_number
from
values ($id_value, $roll_number)) tt
on test_table.id = tt.id
when matched then update set test_table.roll_number = tt.roll_number
when not matched then insert (id, roll_number) values (tt.id, tt.roll_number);
-- Check what the table looks like now
select *
from test_table;
-- +--+-----------+
-- |ID|ROLL_NUMBER|
-- +--+-----------+
-- |1 |5 | <---- Updated row
-- |2 |1 |
-- |3 |6 |
-- +--+-----------+
-- Set the parameters to an id that doesn't exist in the table.
set (id_value, roll_number) = (4, 3);
-- Now the same merge statement should insert
-- a new record with ID 4 and roll_number 3.
merge into test_table
using (select
column1 as id,
column2 as roll_number
from
values ($id_value, $roll_number)) tt
on test_table.id = tt.id
when matched then update set test_table.roll_number = tt.roll_number
when not matched then insert (id, roll_number) values (tt.id, tt.roll_number);
-- Check what the table looks like now
select *
from test_table;
-- +--+-----------+
-- |ID|ROLL_NUMBER|
-- +--+-----------+
-- |4 |3 | <---- New row
-- |1 |5 |
-- |2 |1 |
-- |3 |6 |
-- +--+-----------+