【问题标题】:SQL- Can you Delete a row in BigQuery and Move the deleted row to another table?SQL-您可以在 BigQuery 中删除一行并将删除的行移动到另一个表吗?
【发布时间】:2020-02-10 21:38:50
【问题描述】:

我查看了有关可用语句的文档,但我没有看到任何可以让我将已删除的行移动到另一个表的语句。

这是一个sn-p的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; 

任何想法如何解决这个问题?有可能吗?

【问题讨论】:

    标签: python sql google-bigquery sql-delete


    【解决方案1】:

    不,这在 BigQuery 中是不可能的。它没有实现某些传统 RDBMS 所具有的用于修改和删除行的那种虚拟表。

    要实现类似的操作,您需要先选择要删除的行到新表中(使用 CREATE TABLE AS SELECT 语句),然后从主表中删除它们。

    【讨论】:

      【解决方案2】:

      在您的情况下,我建议您创建一个新表,并为每个表设置适当的过滤器。你可以使用 CREATE TABLE dataset.newtable AS SELECT x FROM T,你可以阅读更多关于它的信息here。因此,您的语法将是:

      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(),您可以在here 找到更多相关信息。您的过滤器语法将被简化,如下所示:

      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';
      

      【讨论】:

      • 感谢您的回复,但我还有更多问题 1) 我需要选择要删除的行到新表中,这怎么可能?
      • 您可以选择列并过滤数据集,以便将要删除的行导出到新表中,您也可以这样做来为要保留的行创建新表。但是,如果您导出要删除的那些,然后从表源中删除它们。所有这些都可以通过我上面展示的方法来完成。万一您不知道该怎么做,我可以一步一步更新答案。
      • 肯定会有帮助
      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 2018-10-16
      • 2013-04-15
      相关资源
      最近更新 更多