我正在使用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
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)
或这个。
您的删除声明中有几个缺陷:
DELETE FROM bookauthor, books
,这没有任何意义。WHERE authorid = (SELECT authorid, count(*) FROM ...
。一个ID如何可能等于一对ID和计数?它必须是WHERE authorid = (SELECT authorid FROM ...
而不是。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);