Является ли подзапрос наиболее эффективным в этом отношении? - PullRequest
0 голосов
/ 12 ноября 2018

Вот мой код, я пытаюсь получить общую сумму цен на книги, которые отображаются в порядке, 'Village bookshop' на '27/09/2018'

Соответствующие таблицы

book(isbn, title, authorID, genre, pubYear, publisher, rrPrice, avgRating)

bookShop(shopNo, shopName, street, city, county)

orders(orderNo, sNo, oDate, salesRep)

orderDetails(oNo, bookISBN, quantity) 

Мой вопрос: есть ли более эффективный способ сделать это, чем подзапрос?

SELECT sum(rrPrice)
FROM   book 
WHERE  isbn in(
    SELECT bookISBN
    FROM   orderDetails INNER JOIN orders ON orderNO = oNO 
           INNER JOIN bookShop on sNO = shopNo
    WHERE  shopName = 'Village bookshop' and oDate='27/09/2018'
)

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Есть много альтернатив для вашего запроса.Я бы предложил использовать предложение EXISTS, поскольку оно возвращает только логические значения, которые всегда быстрее, чем сравнение строк или чисел.

Это будет что-то вроде:

SELECT sum(rrPrice)
FROM   book 
WHERE  EXISTS (
    SELECT *
    FROM   orderDetails od INNER JOIN orders ON (orderNO = oNO) 
                        INNER JOIN bookShop ON (sNO = shopNo)
    WHERE  shopName = 'Village bookshop' AND oDate='27/09/2018' AND book.isbn=od.bookISBN
)

Это просто вопросчитабельности и распространенности, так как вы не собираетесь уходить от IJ.Вы также можете сделать несколько IJ без каких-либо подзапросов, и это тоже будет правильно.

0 голосов
/ 12 ноября 2018

Обычно внутреннее соединение подзапроса работает лучше, чем предложение IN в том же подзапросе, поэтому попробуйте использовать

    SELECT sum(rrPrice)
    FROM   book 
    INNER JOIN (
        SELECT bookISBN
        FROM   orderDetails 
        INNER JOIN orders ON orderNO = oNO 
        INNER JOIN bookShop on sNO = shopNo
        WHERE  shopName = 'Village bookshop' and oDate='27/09/2018'
    ) t on book.isbn = t.bookISBN

Запрос относится только к вопросу: есть наиболее эффективный способ сделать то, что вы делаете с предложением IN ... и не оценивать аспект, связанный с содержанием данных

0 голосов
/ 12 ноября 2018

РЕДАКТИРОВАТЬ: После прочтения, это НЕ лучший подход для использования. Оставляя это для других, чтобы учиться.

Вы можете выбирать из нескольких таблиц и обрабатывать больше логики в своем предложении "WHERE". Нечто похожее на это:

SELECT sum(rrPrice)
FROM book, bookShop, orders, orderDetails
WHERE book.isbn = orderDetails.bookISBN AND orderDetails.oNo = orders.orderNo AND bookShop.shopNo = orders.sNo and shopName = 'Village bookshop' and oDate='27/09/2018'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...