sqlplus DELETE语句

问题描述 投票:-1回答:2

我正在使用sqlplus(oracle)。我试图写一个语句来删除所有尚未根据bookauthor表发布书籍的作者。由于我已加入表格,我不知道如何删除尚未出版图书的作者。此外,我不确定如果我正确获得子查询,以获得未发表书籍的作者的输出。

DELETE 
FROM bookauthor, books
WHERE authorid = 
(SELECT authorid, count(*) pubdate
FROM   bookauthor 
JOIN books USING (isbn)
GROUP BY authorid
HAVING count(*) < 1);

这就是我到目前为止所拥有的。我无法让它正常运行。

对于表books - > isbn,title,pubdate,pubid,成本,零售,折扣,类别 对于表bookauthor - > isbn,authorid

sql oracle sql-delete
2个回答
0
投票
DELETE 
FROM bookauthor
WHERE authorid =
                (SELECT authorid FROM bookauthor WHERE isbn NOT IN (SELECT isbn FROM books))

试试这个。

DELETE 
FROM bookauthor
WHERE authorid =
                (SELECT authorid FROM bookauthor a LEFT OUTER JOIN books b ON a.isbn = b.isbn WHERE b.isbn IS null)

或这个。


2
投票

您的删除声明中有几个缺陷:

  1. 您想要删除尚未发布图书的作者。这意味着您应该在bookauthor表中查找没有条目的作者。但是你甚至没有提到任何作者表和DELETE FROM bookauthor, books,这没有任何意义。
  2. 你比较WHERE authorid = (SELECT authorid, count(*) FROM ...。一个ID如何可能等于一对ID和计数?它必须是WHERE authorid = (SELECT authorid FROM ...而不是。
  3. 在您的子查询中,您要求HAVING count(*) < 1。但是,表中的每个作者至少会出现一次。所以这种情况从未得到满足。您有点问:“bookauthor表中的哪个作者不在bookauthor表中?”。

如上所述,所有这些只对作者表有意义:

试图写一个声明,删除所有作者......

您正在显示两个表。 book表,其中每本书由其ISBN标识。以及将书籍与作者联系起来的bookauthor表格。这称为桥接表(或联结表或关联表或......&dash;这里有很多名称)。它在作者和书之间建立了m:n关系,因此一个作者可以拥有多本书,一本书可以由多个作者书写。 (如果你想要一个1:n的关系,那么一本书只能由一个作者写,那么作者ID将是书表中的一个属性。)所以必须有一个author表,你没有显示bookauthor表是指。

它应该是这样的:

delete from author where authorid not in (select authorid from bookauthor);
© www.soinside.com 2019 - 2024. All rights reserved.