Подзапрос с использованием функции min в sql - PullRequest
0 голосов
/ 31 октября 2018

Вот схема

  • автор (aID, fName, фамилия)
  • книга (isbn, название, authorID, жанр, pubYear, издатель, rrPrice, avgRating)
  • bookShop (shopNo, shopName, улица, город, уезд)
  • заказов (orderNo, sNo, oDate, salesRep)
  • заказДетали (oNo, bookISBN, количество)

А это запрос:

SELECT 
    title, pubYear, quantity 
FROM 
    book 
INNER JOIN 
    orderDetails ON ISBN = bookisbn
WHERE 
    avgRating = (SELECT MIN(avgRating)
                 FROM orderDetails)

Я пытаюсь получить книги с наименьшим рейтингом, но при этом возвращаются все книги

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Думаю, вы захотите:

SELECT b.title, b.pubYear
FROM book b
WHERE b.avgRating = (SELECT min(b2.avgRating)
                     FROM book b2
                    );

Две вещи. Я убрал количество. Я предполагаю, что вы хотите суммировать это, но ваш вопрос не определяет, и отдельная строка для каждого заказа кажется странным. Во-вторых, я добавил псевдонимы таблиц и полные имена столбцов. Вот что важно.

Вы думаете, что ваш запрос:

SELECT b.title, b.pubYear, od.quantity 
FROM book b INNER JOIN 
     orderDetails od
     ON b.ISBN = od.bookisbn
WHERE b.avgRating = (SELECT MIN(od2.avgRating)
                     FROM orderDetails od2
                    )

Но в orderDetails нет столбца avgRating, поэтому предложение WHERE действительно:

WHERE b.avgRating = (SELECT MIN(b.avgRating)
                     FROM orderDetails od2
                    )

Ну, вы сравниваете столбец с его внешней ссылкой - неудивительно, что это всегда так.

Мораль истории: Всегда уточняйте имена таблиц, желательно с осмысленными псевдонимами таблиц, которые являются сокращениями для имен таблиц.

0 голосов
/ 31 октября 2018

Я думаю, что вам нужен запрос ниже, потому что ваш рейтинг находится в таблице книг, поэтому вам может потребоваться изменить имя таблицы в подзапросе

SELECT title, pubYear, quantity 
FROM book INNER JOIN orderDetails ON ISBN=bookisbn
WHERE avgRating=(SELECT min(avgRating)
                    FROM book )
...