MariaDB 子查询使用整行
MariaDB subquery use whole row
通常子查询比较单个或多个字段,删除语句通常通过 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)都可以解决问题(并且可能是您作为主键所需要的)。
编辑:根据 Impaler 的出色建议添加了 ORDER BY
子句。这就是你快速举出例子的结果。
DELETE FROM t
ORDER BY ... -- fill in as needed
LIMIT 6
(适用于任何版本)
通常子查询比较单个或多个字段,删除语句通常通过 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)都可以解决问题(并且可能是您作为主键所需要的)。
编辑:根据 Impaler 的出色建议添加了 ORDER BY
子句。这就是你快速举出例子的结果。
DELETE FROM t
ORDER BY ... -- fill in as needed
LIMIT 6
(适用于任何版本)