我正在尝试从表中删除一行并返回 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 没有提供这一点。在四种主要的 DML 语句中,
DELETE
删除行但不返回任何行;SELECT
返回行但不删除任何行;INSERT
和 UPDATE
既不删除也不返回行。对于许多 DBMS,您可以考虑创建一个具有所需效果的存储过程,但是
我尝试组合查询[通过用分号连接它们]导致当表中肯定还有行时没有返回任何行。
正如评论中所讨论的,这仍然是两个查询。关于如何执行该命令的详细信息不足以确定为什么没有返回行,但我的第一个猜测是根本只执行两个查询中的第一个。