使用同一张表进行雪花合并

时间:2021-03-30 12:16:41

标签: snowflake-cloud-data-platform snowflake-schema

我有一个表,其主键是 1,另一列是卷号。

我想检查表中是否存在 id 值,如果存在则更新其卷号。如果没有在表中插入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);

当值存在时它会更新表,但在插入的情况下不会。未插入任何行。

2 个答案:

答案 0 :(得分:1)

您应该可以使用如下所示的合并语句执行此操作:

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

答案 1 :(得分:0)

当源和目标是同一个表时,如果它不存在于目标中,它就不会在源中。所以没有什么可插入的。