删除一对多关系中的空行(postgresql)

Delete empty rows in one-to-many relationship (postgresql)

Table 书(book_id,书名)是主要的table。 Table book_version (version_id, book_id,publisher) 是另一个 table

book_id 是 book 的主键和 book_version[= 的外键(更新级联删除级联) 29=]。它们是一对多的关系,因为同一本书可能有多个版本

显然,要删除一本书的所有版本:DELETE FROM book WHERE book_id = $some_id

但是,如果我想删除特定版本,我们有两种情况:

  1. 这本书有好几个版本,根据version_id删除条目即可:DELETE FROM book_version WHERE version_id = $some_id
  2. 目前只有一个版本。不仅book_version中的行要删除,book中的行也要删除table

我知道可以使用 count 来完成(我计算 book_version 中的行数。如果超过一,请转到案例 1。否则转到案例 2)。但我想在单个查询中实现这一点,而不包括两个不同的查询或(如果可能)一个 if 语句。也许我可以在数据库结构中做一些事情——不一定是因为查询。非常感谢任何想法。

也许这里可以使用触发器。

类似于:

CREATE TRIGGER deleteIfLastVersionIsDeleted AFTER DELETE ON book_version ...

它可以在一个简单的 SQL 查询中完成。 SQL Fiddle

with dv as (
    delete from book_version
    where version_id = 2
    returning book_id, version_id
)
delete from book b
using dv
where
    b.book_id = dv.book_id
    and
    not exists (
        select version_id
        from book_version
        where
            book_id = dv.book_id
            and
            version_id != dv.version_id
    )