【问题标题】:WHERE IN with multiple columns in RedshiftWHERE IN 在 Redshift 中有多个列
【发布时间】:2018-09-19 15:00:10
【问题描述】:

我正在使用 Amazon Redshift,我有两个表。我从 S3 复制所有数据的临时表和最终应插入所有内容的目标表。

现在我的查询应该从暂存表中的目标表中删除所有内容,这样我就不会有重复了。

DELETE FROM xschema.target
WHERE (col1, col2) IN 
(
SELECT col1, col2
FROM xschema.staging
)
AND col3 = 'de'
;

查询会执行,但会删除col3 = 'de' 为真的所有内容。 语句的IN 条件始终返回true。

例如:如果我的目标表中有以下值

col1 | col2 | col3 | col4
aaa  | 1    | de   | 100
bbb  | 2    | de   | 200
ccc  | 1    | us   | 180

在我的暂存表中包含以下值:

col1 | col2 | col3 | col4
aaa  | 1    | de   | 100
ddd  | 1    | de   | 250

然后我运行上面的查询,从我得到的临时表中删除目标表中的所有值:

col1 | col2 | col3 | col4
ccc  | 1    | us   | 180

但我希望:

col1 | col2 | col3 | col4
bbb  | 2    | de   | 200
ccc  | 1    | us   | 180

到目前为止,我还没有在官方文档或这里找到任何东西(至少对于 redshift 来说不是)。 关于如何解决这个问题的任何想法?

编辑:添加示例

【问题讨论】:

  • 添加一些示例表数据和预期结果 - 作为格式化文本,而不是图像。
  • 你可以这样使用exist吗? WHERE EXISTS (SELECT * FROM xschema.staging Where staging.col1 = target.col1 and staging.col2 = target.col2) AND col3 = 'some-value'
  • 感谢@Markov,这似乎有效。

标签: sql amazon-redshift


【解决方案1】:

我会使用EXISTS:

DELETE 
FROM xschema.target t
WHERE EXISTS (SELECT 1 FROM xschema.staging s WHERE s.col1 = t.col1 AND s.col2 = t.col2) AND
      col3 = 'de';

【讨论】:

    【解决方案2】:

    我认为 Redshift 最近开始支持这一点。以下查询在 Redshift 上没有任何问题。

    select * from inventory
    where (INV_WAREHOUSE_SK, inv_item_sk) IN (select 1, 2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2019-06-24
      相关资源
      最近更新 更多