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作为主键列.
这个查询的作用:
其中至少有一个删除所有行等在同一个表中存在与同非空值的行field和field2.删除所有这些重复项而不会在每组中留下一行.
要保留(例如)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)
我不明白 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(*),并查看哪些行将受到查询的影响。
| 归档时间: |
|
| 查看次数: |
9443 次 |
| 最近记录: |