从表中删除一行并在一个查询 SQL 中获取剩余行

问题描述 投票:0回答:1

我正在尝试从表中删除一行并返回 SQL 数据库中表中的剩余行。我可以通过两个查询轻松完成此操作,但如果可能的话,我想在一个查询中完成此操作,并且正在努力做到这一点。

我当前的实现有两个单独的查询:

DELETE FROM posts 
WHERE rowid = ?

SELECT posts.rowid, circle, description, timestamp
FROM posts
WHERE author = ?
ORDER BY
timestamp DESC

我尝试像这样组合查询:

DELETE FROM posts 
WHERE rowid = ?;
SELECT posts.rowid, circle, description, timestamp
FROM posts
WHERE author = ?
ORDER BY
timestamp DESC

使用分号分隔查询会导致当表中肯定还有行时不会返回任何行。

这是我在执行查询时表中的测试数据,并用分号分隔查询

row 1: circle="first circle", author="[email protected]", description="first", timestamp=<timestamp taken by sql> 
row 2: circle="first circle", author="[email protected]", description="second", timestamp=<timestamp taken by sql> 

所以

WHERE
子句不应该过滤掉所有数据,因为测试数据的作者都是相同的,并且在删除第一行时应该返回第2行,但是它不返回任何行

我想指出的另一件事是,当我尝试第二种方法时,在两个查询之间使用分号,它不会返回任何行。但是,当我使用该查询使用该方法后进行查询时:

SELECT posts.rowid, circle, description, timestamp
FROM posts
WHERE author = ?
ORDER BY
timestamp DESC

它返回我期望从删除+选择查询返回的所有行,确认查询的

DELETE
部分不会删除所有行,并且应该返回表的剩余行

为了了解更多上下文,我在 go 中使用

databases/sql
包,并使用
sql.DB.Query
方法来运行查询

sql sqlite
1个回答
0
投票

我正在尝试从表中删除一行并在一个查询中返回剩余行[...]

抱歉,SQL 没有提供这一点。在四种主要的 DML 语句中,

  • DELETE
    删除行但不返回任何行;
  • SELECT
    返回行但不删除任何行;
  • INSERT
    UPDATE
    既不删除也不返回行。

对于许多 DBMS,您可以考虑创建一个具有所需效果的存储过程,但是

  1. SQLite 不支持存储过程,并且
  2. 在 SP 中,您仍然会使用至少两个单独的语句。

我尝试组合查询[通过用分号连接它们]导致当表中肯定还有行时没有返回任何行。

正如评论中所讨论的,这仍然是两个查询。关于如何执行该命令的详细信息不足以确定为什么没有返回行,但我的第一个猜测是根本只执行两个查询中的第一个。

© www.soinside.com 2019 - 2024. All rights reserved.