我正在使用sqlplus(oracle)。我试图写一条语句来删除所有尚未基于bookauthor表出版本书的作者。 由于我已经加入表格,因此我不知道如何删除尚未出版书籍的作者。另外,我不确定是否正确获取了子查询以获取未出版书籍的作者的输出。
clz
这是我到目前为止所拥有的。 我无法使其正常运行。
对于表DELETE
FROM bookauthor, books
WHERE authorid =
(SELECT authorid, count(*) pubdate
FROM bookauthor
JOIN books USING (isbn)
GROUP BY authorid
HAVING count(*) < 1);
-> isbn,标题,发布日期,pubid,成本,零售,折扣,类别
表books
-> isbn,authorid
答案 0 :(得分:2)
您的删除语句中有几个缺陷:
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
表将书与作者链接起来。这被称为桥接表(或联结表或关联表,或者……-为此有很多名称)。它在作者和书之间建立了m:n关系,因此一位作者可以拥有多本书,而一本书可以由多位作者撰写。 (如果您希望使用1:n关系,那么一本书只能由一位作者撰写,那么作者ID将是book表中的一个属性。)因此,您必须拥有一个author
表没有显示bookauthor
表正在引用。
应该是这样的:
delete from author where authorid not in (select authorid from bookauthor);
答案 1 :(得分: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)
或者这个。