bigquery sql限制更新到一行

carvr3hs  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(272)

我有这个 BigQuery 具有三列和每行的表可以具有与前一列相同的值。
例如:

| col_a | col_b | col_c
+-------+-------+------------
| 123   |   3   | 2019-12-12
| 123   |   3   | 2019-12-12
| 234   |  11   | 2019-10-12

现在我想添加一个名为col\u d的新列,其中包含一个uuid。
问题是当我试图执行 UPDATE 命令我无法一次只更新一行(因为有些行具有相同的值,我希望每个行中的uuid不同)。
我尝试过但运气不佳的事情:(
限制

UPDATE table 
SET col_d = GENERATE_UUID() 
LIMIT 1

我想获取所有行,然后用update命令遍历它们。但是bigquery中的update命令没有限制。
行\u编号

UPDATE table 
SET col_d = ROW_NUMBER() OVER()

但是bigquery不允许在 Update 命令
插入
我可以查询所有行,插入带有uuid的行,然后删除所有没有uuid的旧行。这种方法会奏效,这将是我最后的出路,但我相信有更好的方法,所以我在这里问。
欢迎您提出任何其他意见或建议。

vuktfyat

vuktfyat1#

下面是bigquery标准sql的例子,它为每一行生成不同的uuid,不管它们有多重复

UPDATE `project.dataset.table`
SET col_d = GENERATE_UUID()
WHERE TRUE

注意:根据您的“插入然后删除”选项—我假设表中已经存在列d—否则您将无法执行此操作 DELETE FROM table WHERE col_d IS NULL 正如你在评论中提到的

lrpiutwd

lrpiutwd2#

您可以选择uuid为第四列(col\u d)的数据,然后将该数据另存为新表。

SELECT col_ac, col_b, col_c, GENERATE_UUID() AS col_d
FROM table

这将产生您想要的输出:

| col_a | col_b | col_c       | col_d
+-------+-------+-------------+------------------------------------------
| 123   |   3   | 2019-12-12  | e3784e4d-59bb-433b-a9ac-3df318e0f675
| 123   |   3   | 2019-12-12  | 430d034a-6292-4f5e-b1b0-0ee5550af3f6
| 234   |  11   | 2019-10-12  | 3e7e14d2-3077-4030-a704-5a2b7fc3c11e

由于bigquery不允许像传统sql那样添加包含数据的列,因此下面应该创建一个添加了uuid值的新表。

CREATE OR REPLACE TABLE table AS 
SELECT *, GENERATE_UUID() AS col_d
FROM table

请注意,表历史记录可能会被删除,因此请先备份它。在任何情况下,都应该在进行此类更新之前备份数据,以免出现不希望的结果。

8xiog9wr

8xiog9wr3#

因为有些行具有相同的值,我希望它们中的每一行都有不同的uuid
这应该是你想要的:

UPDATE table 
    SET col_d = GENERATE_UUID()

我不明白你为什么要用 limit ,如果要更新所有行。
也就是说,bigquery对 UPDATE s、 所以 CREATE TABLE 弗罗姆希尔建议的方法似乎更合适。

相关问题