SQL - Можете ли вы удалить строку в BigQuery и переместить удаленную строку в другую таблицу? - PullRequest
0 голосов
/ 11 февраля 2020

Я просмотрел документацию по доступным операторам, но я не видел ни одного оператора, который позволил бы мне перемещать удаленные строки в другую таблицу.

Вот фрагмент кода sql:

CREATE TABLE %s;
 INSERT INTO rm.table_access (%s) VALUES (%s);
 DELETE FROM rm.table_access
    Where (%s) LIKE 'HEARTBEAT' AND  -7 AND -077 AND -77 
    OUTPUT Deleted.(%s) INTO test_tables; 

Есть идеи, как к этому подойти? Это вообще возможно?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

В вашем случае я бы предложил вам создать новую таблицу с соответствующими фильтрами для каждой. Вы можете использовать CREATE TABLE dataset.newtable AS SELECT x ОТ T , вы можете узнать больше об этом здесь . Таким образом, ваш синтаксис будет:

CREATE TABLE `your_new_table` AS SELECT * 
FROM `source_table`
WHERE  VALUES LIKE 'HEARTBEAT' AND VALUES LIKE '-7' AND VALUES LIKE '-77'

Я использовал одинарные кавычки в операторе WHERE , потому что я предполагал, что поле, которое вы фильтруете, является String . Другой вариант будет использовать функцию REGEXP_CONTAINS () , вы можете узнать больше об этом здесь . Ваш синтаксис для фильтра будет упрощен следующим образом:

WHERE REGEXP_CONTAINS(VALUES,"HEARTBEAT|STRING|STRING")

Обратите внимание, что значения, которые вы сравниваете с помощью вышеуказанного метода, должны быть строкой. Поэтому вы должны убедиться в этом преобразовании перед его использованием, в этом случае вы используете функцию CAST () .

Кроме того, если вы хотите удалить строки в исходной таблице, вы можете используйте DELETE . Синтаксис следующий:

DELETE `source_table` WHERE field_1 = 'HEARTBEAT'

Обратите внимание, что вы хотите удалять строки непосредственно из исходной таблицы.

Надеюсь, это поможет.

ОБНОВЛЕНИЕ

Создание новой таблицы с желаемыми строками и другой таблицы с "удаленными" строками.

#Table with the rows which match the filter and will be "deleted"
#Notice that you have to provide the path to you table 
#`project.dataset.your_new_table`
CREATE TABLE `your_new_table` AS 
SELECT field1, field2 #select the columns you want
FROM `source_table`
WHERE  field1 LIKE 'HEARTBEAT' AND field1 LIKE '-7' AND field1 LIKE '-77'

Теперь вы получите строки, которые не прошли через фильтр на первом шаге. Они составят таблицу с нужными строками, как показано ниже:

CREATE TABLE `table_desired_rows` AS 
SELECT field1, field2 #select the columns you want
FROM `source_table`
WHERE  field1 NOT LIKE 'HEARTBEAT' 
   AND field1 NOT LIKE '-7' 
   AND field1 NOT LIKE '-77'

Теперь у вас есть исходная таблица с необработанными данными, другая таблица с нужными строками и таблица с игнорируемыми строками.

Второй вариант:

Если вам не нужны необработанные данные, это означает, что вы можете изменить исходную таблицу. Сначала вы можете создать таблицу с игнорируемыми строками, а затем удалить эти строки из исходных данных.

#creating the table with the rows which will be deleted
#notice that you create a new table with these rows
CREATE TABLE `table_ignored_rows` AS 
SELECT field1, field2 #select the columns you want
FROM `source_table`
WHERE  field1 LIKE 'HEARTBEAT' 
   AND field1 LIKE '-7' 
   AND field1 LIKE '-77';
#now deleting the rows from the source table
DELETE `source_table` WHERE  field1 LIKE 'HEARTBEAT' 
   AND field1 LIKE '-7' 
   AND field1 LIKE '-77';
0 голосов
/ 11 февраля 2020

Нет, это невозможно в BigQuery. В ней нет реализации типа виртуальных таблиц для измененных и удаленных строк, которые есть в некоторых традиционных СУБД.

Чтобы реализовать нечто подобное, вам нужно будет выбрать строки, которые нужно удалить, в новую таблицу ПЕРВЫМ (используя CREATE TABLE AS SELECT), затем удалите их из основной таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...