如果 Redshift 中存在表,则从表中删除行,否则忽略删除

Posted

技术标签:

【中文标题】如果 Redshift 中存在表,则从表中删除行,否则忽略删除【英文标题】:Delete rows from a table if table exists in Redshift otherwise ignore deletion 【发布时间】:2017-08-21 09:24:55 【问题描述】:

我正在使用 Redshift。如果表存在,我想要一个查询从红移表中删除选定的行,否则忽略该语句。

【问题讨论】:

您必须提供更多信息。你的问题不是很有帮助 【参考方案1】:

Redshift 的 SQL 方言不包含像 IF.. THEN 这样的流控制语句,因此您无法在单个 SQL 语句中执行此操作。

您的应用程序或进程将需要首先查询 Redshift 表元数据以确定表是否存在,例如

select 1 from pg_tables where schemaname = 'myschema' and tablename = 'myschema';

如果返回数据(即表存在),则应用程序或进程将执行删除语句,如果没有返回数据,则应用程序或进程不执行任何操作。基本上,您需要在 Redshift 外部处理“如果这样做,则执行此操作”逻辑。

【讨论】:

【参考方案2】:

我推荐@Nathan 的回答。我会使用 python/psycopg2 来设置这个逻辑。第一个查询将检查表在pg_tables 中是否存在(例如SELECT count(1) FROM pg_tables WHERE tablename='foo'),并将结果存储在一个变量中。然后,您将检查该变量的结果以决定是否启动第二个查询(您的删除)。

但是,也许您不想在 Python 中执行此操作。你只是关于 Redshift (这很甜蜜)。您可以在 Redshift 中运行 DELETE 查询。如果该表不存在,则查询失败并且没有任何反应。如果表是,则删除数据。在这里生成错误并没有什么坏处。

【讨论】:

以上是关于如果 Redshift 中存在表,则从表中删除行,否则忽略删除的主要内容,如果未能解决你的问题,请参考以下文章

Redshift:如果值存在,则从表 1 中获取值,否则从表 2 中提取

如果存在则从表中选择,否则从oracle中的另一个表中选择

如果当前表中不存在,则从其他表中选择行

mysql - 如果不在另一个表中,则从一个表中选择,否则从另一个表中选择

如果存在表 B,则从表 B 中获取数据,否则保留表 A(在某些列之后)

从表中删除记录,如果其特定值未出现在另一个表中