sqlplus DELETE语句

时间:2019-03-01 03:39:04

标签: sql oracle sql-delete

我正在使用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

2 个答案:

答案 0 :(得分: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表将书与作者链接起来。这被称为桥接表(或联结表或关联表,或者……-为此有很多名称)。它在作者和书之间建立了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)

或者这个。