在 Redshift 中使用 CTE 和更新

TZ1*_*100 6 sql common-table-expression amazon-redshift

我正在将一些 SQL 逻辑从 SSMS 中使用的 T-SQL 转换为 Amazon Redshift。我相信 Redshift 是 Postgres 8.0.2 版的一个分支,所以除非使用 Postgres 9.1,否则下面的内容可能是不可能的。

WITH CTE_ID AS 
(
SELECT FULL_NAME, COUNT(DISTINCT ID) as ID_COUNT, MAX(ID) AS MAX_ID
FROM MEMBERS
GROUP BY FULL_NAME
HAVING COUNT(DISTINCT ID) > 1
)
UPDATE a
SET a.ID = b.MAX_ID
FROM MEMBERS a
INNER JOIN CTE_ID b
ON a.FULL_NAME = b.FULL_NAME
Run Code Online (Sandbox Code Playgroud)

如果 Amazon Redshift 不支持此功能,我的最佳选择是创建一个新的“临时”表并用 CTE 生成的值填充它吗?

âńō*_*oůŜ 5

您可以将查询重写为派生表,如@a_horse_with_no_name所述:

UPDATE MEMBERS
SET a.ID = b.MAX_ID
FROM MEMBERS a
INNER JOIN (
  SELECT FULL_NAME, COUNT(DISTINCT ID) as ID_COUNT, MAX(ID) AS MAX_ID
  FROM MEMBERS
  GROUP BY FULL_NAME
  HAVING COUNT(DISTINCT ID) > 1
  ) b
ON a.FULL_NAME = b.FULL_NAME
Run Code Online (Sandbox Code Playgroud)