Реализация курсора MS SQL в BigQuery: выполнение различных операций на основе значений выбранных строк - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь конвертировать курсор из MS SQL в BigQuey Standard SQL. Можем ли мы сделать это используя какое-то время l oop? Каков наилучший подход для написания сценария ниже курсора в BigQuery? Заранее спасибо!

declare @t1 int, @t2 int, @t3 int, @id int
declare @name varchar(30), @status varchar(30)

declare @cursor cursor

set @cursor = cursor for select * from table_A

open @cursor
fetch next from @cursor into @t1, @t2, @t3, @id, @name, @status

while @@fetch_status = 0
begin

delete from table_B where id = @id

update table_B b 
set b.time = gettime() /*this can give different results if I try batch processing*/
where b.name = @name
and b.status = @status

if (@t1 is null and @t2 is null)
begin
insert into table_C (parent, child)
select 0, 0
end

if (@t2 is null and @t3 is null)
begin
insert into table_C (parent, child, level, is_above, is_below) /*this insert is different from above insert*/
select @t1, @t2, 3, 2, 1
end

fetch next from @cursor into @t1, @t2, @t3, @id, @name, @status
end

close @cursor

deallocate @cursor

1 Ответ

2 голосов
/ 24 апреля 2020

Как заметил Сабри - вам вовсе не нужен курсор / l oop здесь

Так что ниже script (BigQuery Standard SQL) напоминает ваш начальный лог c в упрощенном виде c, чтобы соответствовать вашим операциям in-l oop один-к-одному

DELETE FROM table_B
WHERE id IN (SELECT DISTINCT id FROM table_A)

UPDATE table_B b
SET time = CURRENT_TIMESTAMP() 
FROM table_A a
WHERE b.name = a.name
AND b.status = a.status

INSERT INTO table_C (parent, child)
SELECT 0, 0
FROM table_A
WHERE t1 IS NULL 
AND t2 IS NULL 

INSERT INTO table_C (parent, child, level, is_above, is_below) 
SELECT t1, t2, 3, 2, 1
FROM table_A
WHERE t2 IS NULL 
AND t3 IS NULL 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...