通常,子查询比较单个或多个字段,而delete语句通常按ID删除值。不幸的是,我没有ID字段,并且必须对其他类型的表使用通用方法。这就是为什么我要使用使用limit和offset作为解析行的子查询的原因。
我知道这种方法存在风险,但是有什么方法可以通过子查询并比较整个行来删除行吗?
DELETE FROM table WHERE * = ( SELECT * FROM table LIMIT 1 OFFSET 6 )
我正在使用最新版本的MariaDB
这听起来真的很奇怪,但我要判断谁?:)
我只是依靠主键:
DELETE FROM table WHERE id_table = (SELECT id_table FROM table LIMIT 1 OFFSET 6)
更新:哦,所以你没有主键?你可以通过这种方式加入整行(假设它有五列,分别命名为a,b,c,d,e):
DELETE t
FROM table t
INNER JOIN (
SELECT a, b, c, d, e
FROM table
ORDER BY a, b, c, d, e
LIMIT 1 OFFSET 6
) ROW6 USING (a, b, c, d, e);
唯一标识行的列的任何子集(例如a,c,d)都可以解决问题(无论如何,你可能都需要将其作为主键)。
编辑:ORDER BY
根据The Impaler的出色建议添加了一个子句。这就是你迅速敲一个例子所得到的。
哦,哇,这看起来真是我要找的东西:)将会在今天晚上进行测试。到目前为止,Thx的输入!
LIMIT
/很少OFFSET
没有ORDER BY
道理。' '逻辑可能是一样的吗?从表t删除t t内部联接(SELECT *从表LIMIT 1 OFFSET 6)ROW6 using(' ');
副手,我不认为
USING(*)
是合法的语法。您可能需要使用该information_schema.columns
表来动态构造列名。