从表A中删除加入Redshift中的表A.

mar*_*cog 4 sql delete-row amazon-redshift

我试图在PostgreSQL 8.0中编写以下MySQL查询(具体来说,使用Redshift):

DELETE t1 FROM table t1
LEFT JOIN table t2 ON (
    t1.field   = t2.field AND
    t1.field2  = t2.field2
)
WHERE t1.field > 0
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 8.0不支持DELETE FROM table USING.文档中的示例说您可以在where子句中引用其他表中的列,但这不起作用,因为我正在加入我正在删除的同一个表.另一个例子是一个子选择查询,但我正在使用的表的主键有四列,所以我看不到让它工作的方法.

Erw*_*ter 11

Amazon Redshift可能基于Postgres 8.0,但却是一个非常不同的东西.我不使用它,但手动运筹学,该USING条款在支持的DELETE语句:

只需使用现代形式:

DELETE FROM tbl
USING  tbl t2
WHERE  t2.field  = tbl.field
AND    t2.field2 = tbl.field2
AND    t2.pkey  <> tbl.pkey    -- exclude self-join
AND    tbl.field > 0;
Run Code Online (Sandbox Code Playgroud)

这是假设JOIN而不是LEFT JOIN你的MySQL语句,这没有任何意义.我还添加了条件AND t2.pkey <> t1.pkey,使其成为一个有用的查询.这排除了加入自身的行.pkey作为主键列.

这个查询的作用:
其中至少有一个删除所有行在同一个表中存在与同非空值的行fieldfield2.删除所有这些重复项而不会在每组中留下一行.

要保留(例如)pkey每组重复项最小的行,请使用t2.pkey < t2.pkey.

一个EXISTS半连接(如@wilplasser已经暗示)可能是一个更好的选择,尤其是在多行,可以加入(行只能使用一次,反正删除):

DELETE FROM tbl
WHERE  field > 0
AND    EXISTS (
   SELECT 1
   FROM   tbl t2
   WHERE  t2.field  = tbl.field
   AND    t2.field2 = tbl.field2
   AND    t2.pkey  <> tbl.pkey 
   );
Run Code Online (Sandbox Code Playgroud)

  • 在redshift中,不允许为目标表加上别名,即,您必须使用`Dblte FROM tbl1 USING ...`编码。 (3认同)

wil*_*ser 3

我不明白 mysql 语法,但你可能想要这个:

DELETE FROM mytablet1
WHERE t1.field > 0
   -- don't need this self-join if {field,field2}
   -- are a candidate key for mytable
   -- (in that case, the exists-subquery would detect _exactly_ the
   -- same tuples as the ones to be deleted, which always succeeds)
-- AND EXISTS (
--     SELECT *
--     FROM mytable t2 
--     WHERE t1.field = t2.field
--     AND t1.field2  = t2.field2
--    )
    ;
Run Code Online (Sandbox Code Playgroud)

注意:出于测试目的,您可以将DELETE关键字替换为SELECT *SELECT COUNT(*),并查看哪些行将受到查询的影响。