sqlplus УДАЛИТЬ заявление - PullRequest
       18

sqlplus УДАЛИТЬ заявление

0 голосов
/ 01 марта 2019

Я использую sqlplus (оракул).Я пытаюсь написать заявление об удалении всех авторов, которые еще не опубликовали книгу на основе таблицы 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, cost, retail, discount, категория
для таблицы bookauthor -> isbn, authorid

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

В вашем утверждении об удалении есть несколько недостатков:

  1. Вы хотите удалить авторов, которые еще не опубликовали книгу.Это означает, что вы должны искать авторов, у которых нет записей в таблице bookauthor.Но вы даже не упоминаете ни одну таблицу авторов и DELETE FROM bookauthor, books вместо этого, что не имеет смысла.
  2. Вы сравниваете WHERE authorid = (SELECT authorid, count(*) FROM ....Как один идентификатор может равняться паре ID и счет?Вместо этого должно быть WHERE authorid = (SELECT authorid FROM ....
  3. В вашем подзапросе вы запрашиваете HAVING count(*) < 1.Но каждый автор в таблице встречается хотя бы раз.Так что это условие никогда не выполняется.Вы задаетесь вопросом: «Кого из авторов в таблице bookauthor нет в таблице bookauthor?».

Как уже упоминалось, все это имеет смысл только с таблицей авторов:

пытается написать заявление об удалении всех авторов , которые ...

Вы показываете две таблицы.Таблица book, где каждая книга идентифицируется по номеру ISBN.И таблица bookauthor, которая связывает книги с авторами.Это называется таблицей мостов (или соединительной таблицей или ассоциативной таблицей, или ... - ну, для этого есть много имен).Он устанавливает отношение m: n между автором и книгой, поэтому у одного автора может быть много книг, а одна книга может быть написана несколькими авторами.(Если вы хотите вместо этого соотношение 1: n, чтобы книга могла быть написана только одним автором, тогда идентификатор автора был бы атрибутом в таблице книги.) Поэтому должна быть таблица author, которой у вас нетпоказано, что таблица bookauthor имеет в виду.

Это должно быть что-то вроде:

delete from author where authorid not in (select authorid from bookauthor);
0 голосов
/ 01 марта 2019
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)

Или это.

...