#sql #sqlite #join #common-table-expression
#sql #sqlite #Присоединиться #common-table-expression
Вопрос:
Форум. Я пытаюсь запустить SQL для своего местного книжного магазина. Проблема в том, чтобы показать последних N учеников и все книги, которые они заказали.
Моя попытка:
CREATE TABLE books (
id INTEGER,
name TEXT,
genre TEXT,
pages INTEGER,
price INTEGER
);
INSERT INTO books (id, name, genre, pages, price)
VALUES
(1, name_1, genre_1, 100, 10),
(2, name_2, genre_2, 200, 20),
(3, name_3, genre_3, 300, 30);
--etc rows here
CREATE TABLE orders (
id INTEGER,
name TEXT,
id_book INTEGER,
date INTEGER --in SQLite INTEGER for a date is okay
);
INSERT INTO orders (id, name, id_book, date)
VALUES
(1, name_1, id_book_1, date_1),
(2, name_2, id_book_2, date_2),
(3, name_3, id_book_3, date_3);
--etc rows here
WITH last_students AS(
SELECT orders.name
FROM orders
ORDER BY orders.id DESC
LIMIT 3) --creates temp table with last 3 names of students
SELECT orders.name, books.name
FROM books
INNER JOIN last_students
ON books.id = last_students.id_book;
Это нормальный код? Проверка синтаксиса показывает ошибку только в строке 8, которую я не понимаю. Заранее благодарю вас
Ответ №1:
Вы можете присоединиться books
orders
и отфильтровать результаты для последних N студентов:
WITH last_students AS (
SELECT DISTINCT name
FROM orders
ORDER BY date DESC LIMIT 3
)
SELECT o.name AS student_name,
b.name AS book_title
FROM books b INNER JOIN orders o
ON o.id_book = b.id
WHERE o.name IN last_students
CTE возвращает последних 3 студентов (по дате, а не по идентификатору), которые заказали книгу.
Посмотрите демонстрацию.