在 Redshift 上的过程中结合使用 Cursor 和 UPDATE 语句的示例
An example of a Cursor & UPDATE statement in conjunction inside a procedure on Redshift
能否提供一个 Redshift 过程的示例,其中您结合使用了游标和 UPDATE 语句?这是否可行,我找不到例子。我正在寻找一个简单的模板代码来学习如何在 Redshift 上的一个过程中将这两个结合在一起。
这是一个示例用例:
我有一个 table 这样的:
CREATE TABLE test_tbl
(
Contactid VARCHAR(500),
sfdc_OppId_01 VARCHAR(500),
sfdc_OppId_02 VARCHAR(500),
sfdc_OppId_03 VARCHAR(500),
sfdc_OppId_04 VARCHAR(500),
sfdc_OppId_05 VARCHAR(500),
sfdc_OppId_06 VARCHAR(500)
)
我想用另一个 table 的相对值更新每个 sfdc_OppId_xx; sfdc_tbl。这是 sfdc_tbl 的样子:
sfdc_contactId
sfdc_Opp_Id
AA123hgt
999999
AA123hgt
888888
AA123hgt
777777
AA123hgt
432567
AA123hgt
098765
AA123hgt
112789
如您所见,sfdc_tbl 中有重复的 sfdc_contactid。我的最终目标是在 test_tbl 中水平列出给定 contactid 的所有 sfdc_Opp_Id。我不会在 test_tbl.
中有重复的 contactid
INSERT INTO test_tbl (Contactid)
SELECT sfdc_contactId
FROM sfdc_tbl
GROUP BY sfdc_contactId
这就是我要做的事情:
CREATE OR REPLACE PROCEDURE testing_procedure (results INOUT refcursor)
AS
$$
BEGIN
OPEN cursor_testing FOR
SELECT
Ops.sfdc_Opp.id,
ROW_NUMBER () OVER(PARTITION BY Ops.sfdc_contactId ORDER BY sfdc_Opp_Id ) RWN
FROM sfdc_tbl Ops
INNER JOIN test_tbl tbl
ON Ops.sfdc_contactId = tbl.contactid;
UPDATE test_tbl
SET sfdc_Opp_01 = CASE WHEN cursor_testing.RWN = 1 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_02 = CASE WHEN cursor_testing.RWN = 2 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_03 = CASE WHEN cursor_testing.RWN = 3 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_04 = CASE WHEN cursor_testing.RWN = 4 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_05 = CASE WHEN cursor_testing.RWN = 5 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_06 = CASE WHEN cursor_testing.RWN = 6 THEN cursor_testing.sfdc_Ops_id ELSE NULL END
;
END;
$$
LANGUAGE plpgsql;
我一直收到错误消息
incorrect syntax at or near "cursor_testing"
我用类似的解决方案回答了一个问题。 SQL 使用游标的数据插入到 table 中,同样的路径应该适用于 UPDATE - How to join System tables or Information Schema tables with User defined tables in Redshift
话虽这么说,但看看您的代码,我真的认为您最好使用临时 table 而不是游标。首先要注意的是游标不是 table。您的使用模式将不起作用 AFAIK。您逐行(或成串)读取游标,这与 Redshift 的列式 table 存储相反。因此,您需要循环游标中的行并执行 N 次更新。这将非常慢!您将查询列式数据,将结果作为行存储在游标中,逐行读取这些行,然后对每一行执行新查询 (UPDATE)。恶心!留在“柱状地带”并使用临时 table.
能否提供一个 Redshift 过程的示例,其中您结合使用了游标和 UPDATE 语句?这是否可行,我找不到例子。我正在寻找一个简单的模板代码来学习如何在 Redshift 上的一个过程中将这两个结合在一起。
这是一个示例用例:
我有一个 table 这样的:
CREATE TABLE test_tbl
(
Contactid VARCHAR(500),
sfdc_OppId_01 VARCHAR(500),
sfdc_OppId_02 VARCHAR(500),
sfdc_OppId_03 VARCHAR(500),
sfdc_OppId_04 VARCHAR(500),
sfdc_OppId_05 VARCHAR(500),
sfdc_OppId_06 VARCHAR(500)
)
我想用另一个 table 的相对值更新每个 sfdc_OppId_xx; sfdc_tbl。这是 sfdc_tbl 的样子:
sfdc_contactId | sfdc_Opp_Id |
---|---|
AA123hgt | 999999 |
AA123hgt | 888888 |
AA123hgt | 777777 |
AA123hgt | 432567 |
AA123hgt | 098765 |
AA123hgt | 112789 |
如您所见,sfdc_tbl 中有重复的 sfdc_contactid。我的最终目标是在 test_tbl 中水平列出给定 contactid 的所有 sfdc_Opp_Id。我不会在 test_tbl.
中有重复的 contactid INSERT INTO test_tbl (Contactid)
SELECT sfdc_contactId
FROM sfdc_tbl
GROUP BY sfdc_contactId
这就是我要做的事情:
CREATE OR REPLACE PROCEDURE testing_procedure (results INOUT refcursor)
AS
$$
BEGIN
OPEN cursor_testing FOR
SELECT
Ops.sfdc_Opp.id,
ROW_NUMBER () OVER(PARTITION BY Ops.sfdc_contactId ORDER BY sfdc_Opp_Id ) RWN
FROM sfdc_tbl Ops
INNER JOIN test_tbl tbl
ON Ops.sfdc_contactId = tbl.contactid;
UPDATE test_tbl
SET sfdc_Opp_01 = CASE WHEN cursor_testing.RWN = 1 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_02 = CASE WHEN cursor_testing.RWN = 2 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_03 = CASE WHEN cursor_testing.RWN = 3 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_04 = CASE WHEN cursor_testing.RWN = 4 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_05 = CASE WHEN cursor_testing.RWN = 5 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_06 = CASE WHEN cursor_testing.RWN = 6 THEN cursor_testing.sfdc_Ops_id ELSE NULL END
;
END;
$$
LANGUAGE plpgsql;
我一直收到错误消息
incorrect syntax at or near "cursor_testing"
我用类似的解决方案回答了一个问题。 SQL 使用游标的数据插入到 table 中,同样的路径应该适用于 UPDATE - How to join System tables or Information Schema tables with User defined tables in Redshift
话虽这么说,但看看您的代码,我真的认为您最好使用临时 table 而不是游标。首先要注意的是游标不是 table。您的使用模式将不起作用 AFAIK。您逐行(或成串)读取游标,这与 Redshift 的列式 table 存储相反。因此,您需要循环游标中的行并执行 N 次更新。这将非常慢!您将查询列式数据,将结果作为行存储在游标中,逐行读取这些行,然后对每一行执行新查询 (UPDATE)。恶心!留在“柱状地带”并使用临时 table.