首页 > 解决方案 > 在 MYSQL 查询中使用 TOP 删除重复项会引发错误代码

问题描述

我只是使用 TOP 语法从表中删除重复值。但它返回错误代码。

询问:

DELETE top(SELECT COUNT(*)-1 FROM tests WHERE test_name='WALLET_01' AND product_id=25)FROM tests WHERE test_name='WALLET_01' And product_id=25;

错误代码:

错误代码:1064 您的 SQL 语法有错误;

在查询下单独执行,返回 int 值为 1:

SELECT COUNT(*)-1 FROM tests WHERE test_name='WALLET_01' AND product_id=25;

任何人都可以帮助我为什么我收到语法错误?

标签: mysqljdbc

解决方案


您不能在Top中使用子查询

Top句法

[   
    TOP (expression) [PERCENT]  
    [ WITH TIES ]  
]  

表达

Is the numeric expression that specifies the number of rows to be returned. expression is implicitly converted to a float value if PERCENT is specified; otherwise, it is converted to bigint.

我们可以看到它只支持子TOP查询expression


编辑

我看到你改变了你使用的dbms。

Mysql 不支持TOP,但您可以使用LIMIT获取限制行。

如果PK您的表中没有,您可以尝试使用dynamic SQLget 来决定要在运行时删除多少行。

架构(MySQL v5.6)

CREATE TABLE tests(
test_name VARCHAR(50),
product_id int
);


INSERT INTO tests VALUES('WALLET_01',25);
INSERT INTO tests VALUES('WALLET_01',25);



SET @sql = NULL;
SET @Rn = NULL;
SELECT
   (COUNT(*)-1) 
INTO @Rn
FROM tests
WHERE test_name='WALLET_01' AND product_id=25;


SET @sql = CONCAT('DELETE FROM tests WHERE test_name=''WALLET_01'' AND product_id=25 limit ',@Rn);

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

查询 #1

SELECT * FROM tests;

| test_name | product_id |
| --------- | ---------- |
| WALLET_01 | 25         |

在 DB Fiddle 上查看


推荐阅读