sqlplus DELETE 语句
sqlplus DELETE statement
我正在使用 sqlplus (oracle)。我试图写一个声明来删除所有尚未出版基于书作者 table 的书的作者。
由于我加入了 tables ,我不知道如何删除还没有出版一本书的作者。此外,我不确定我是否正确地获得了子查询以获取未出版书籍的作者的输出。
DELETE
FROM bookauthor, books
WHERE authorid =
(SELECT authorid, count(*) pubdate
FROM bookauthor
JOIN books USING (isbn)
GROUP BY authorid
HAVING count(*) < 1);
这就是我目前所拥有的。
我无法正确理解 运行。
For table books
-> isbn, title, pubdate, pubid, cost, retail, discount, category
对于 table 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 语句中存在几个缺陷:
- 您想删除尚未出版图书的作者。这意味着您应该寻找在 bookauthor table 中没有条目的作者。但是您甚至没有提到任何作者 table 和
DELETE FROM bookauthor, books
,这没有任何意义。
- 你比较
WHERE authorid = (SELECT authorid, count(*) FROM ...
。一个 ID 怎么可能等于一对 ID 并计数?它必须是 WHERE authorid = (SELECT authorid FROM ...
而不是。
- 在您的子查询中,您要求
HAVING count(*) < 1
。但是 table 中的每个作者当然至少出现一次。所以这个条件永远不会满足。你有点问:"Which of the authors in the bookauthor table is not in the bookauthor table?".
如前所述,所有这些只有作者才有意义 table:
trying to write a statement to remove all authors that ...
您显示了两个 table。 book
table 其中每本书都由其 ISBN 标识。以及将书籍链接到作者的 bookauthor
table。这被称为桥梁 table(或连接点 table 或关联 table 或... &dash;好吧,它有很多名称)。它在作者和书籍之间建立了 m:n 关系,因此一个作者可以拥有多本书,一本书可以由多个作者撰写。 (如果你想要一个 1:n 关系,这样一本书只能由一个作者写,那么作者 ID 将是书 table 中的一个属性。)所以必须有一个 author
table 你没有证明 bookauthor
table 指的是什么。
应该是这样的:
delete from author where authorid not in (select authorid from bookauthor);
我正在使用 sqlplus (oracle)。我试图写一个声明来删除所有尚未出版基于书作者 table 的书的作者。 由于我加入了 tables ,我不知道如何删除还没有出版一本书的作者。此外,我不确定我是否正确地获得了子查询以获取未出版书籍的作者的输出。
DELETE
FROM bookauthor, books
WHERE authorid =
(SELECT authorid, count(*) pubdate
FROM bookauthor
JOIN books USING (isbn)
GROUP BY authorid
HAVING count(*) < 1);
这就是我目前所拥有的。 我无法正确理解 运行。
For table books
-> isbn, title, pubdate, pubid, cost, retail, discount, category
对于 table 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 语句中存在几个缺陷:
- 您想删除尚未出版图书的作者。这意味着您应该寻找在 bookauthor table 中没有条目的作者。但是您甚至没有提到任何作者 table 和
DELETE FROM bookauthor, books
,这没有任何意义。 - 你比较
WHERE authorid = (SELECT authorid, count(*) FROM ...
。一个 ID 怎么可能等于一对 ID 并计数?它必须是WHERE authorid = (SELECT authorid FROM ...
而不是。 - 在您的子查询中,您要求
HAVING count(*) < 1
。但是 table 中的每个作者当然至少出现一次。所以这个条件永远不会满足。你有点问:"Which of the authors in the bookauthor table is not in the bookauthor table?".
如前所述,所有这些只有作者才有意义 table:
trying to write a statement to remove all authors that ...
您显示了两个 table。 book
table 其中每本书都由其 ISBN 标识。以及将书籍链接到作者的 bookauthor
table。这被称为桥梁 table(或连接点 table 或关联 table 或... &dash;好吧,它有很多名称)。它在作者和书籍之间建立了 m:n 关系,因此一个作者可以拥有多本书,一本书可以由多个作者撰写。 (如果你想要一个 1:n 关系,这样一本书只能由一个作者写,那么作者 ID 将是书 table 中的一个属性。)所以必须有一个 author
table 你没有证明 bookauthor
table 指的是什么。
应该是这样的:
delete from author where authorid not in (select authorid from bookauthor);