COUNT возвращает количество всех строк, даже исключенных с исключением - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь написать запрос sql, где желаемый вывод составляет 176 строк

Вот запрос:


SELECT name FROM people WHERE id IN(SELECT person_id FROM stars WHERE movie_id IN (SELECT id FROM movies WHERE id IN ( SELECT movie_id FROM stars WHERE person_id = (SELECT id FROM people WHERE birth = 1958 AND name = 'Kevin Bacon'))))EXCEPT SELECT name FROM people WHERE name = "Kevin Bacon";

Я получаю правильный вывод, но когда я проверяю код для подсчета количества строк (я заменяю имя на COUNT (имя)) COUNT возвращает 177, потому что он не исключает строки в выражении EXCEPT.

Есть ли способ заставить считать учесть оператор EXCEPT ??? Вот еще немного информации:

Это набор проблем https://cs50.harvard.edu/x/2020/psets/7/movies/ Я застрял на 13. sql

.schema возвращает

CREATE TABLE movies (
                    id INTEGER,
                    title TEXT NOT NULL,
                    year NUMERIC,
                    PRIMARY KEY(id)
                );
CREATE TABLE stars (
                movie_id INTEGER NOT NULL,
                person_id INTEGER NOT NULL,
                FOREIGN KEY(movie_id) REFERENCES movies(id),
                FOREIGN KEY(person_id) REFERENCES people(id)
            );
CREATE TABLE directors (
                movie_id INTEGER NOT NULL,
                person_id INTEGER NOT NULL,
                FOREIGN KEY(movie_id) REFERENCES movies(id),
                FOREIGN KEY(person_id) REFERENCES people(id)
            );
CREATE TABLE ratings (
                movie_id INTEGER NOT NULL,
                rating REAL NOT NULL,
                votes INTEGER NOT NULL,
                FOREIGN KEY(movie_id) REFERENCES movies(id)
            );
CREATE TABLE people (
                id INTEGER,
                name TEXT NOT NULL,
                birth NUMERIC,
                PRIMARY KEY(id)
            );

1 Ответ

1 голос
/ 07 марта 2020

Чтобы исключение работало, аргументы с обеих сторон ИСКЛЮЧЕНИЯ должны быть одинаковыми. Лучший способ получить счет в этот момент - обернуть весь запрос, чтобы получить производную таблицу, чтобы имя «Кевин Бэкон» можно было «исключить», а затем запросить счет из этой производной таблицы.

Select count(1)
From (
SELECT name FROM people 
WHERE id IN(SELECT person_id FROM stars 
WHERE movie_id IN (SELECT id FROM movies
WHERE id IN ( SELECT movie_id FROM stars 
WHERE person_id = (SELECT id FROM people 
WHERE birth = 1958 AND name = 'Kevin Bacon'))))
EXCEPT SELECT name FROM people WHERE name = 'Kevin Bacon'
) as A

...