Что не так с моим оператором SQL-EXCEPT?
Когда я выбираю "BookID" из моих таблиц "Stats" и "Book", я получаю желаемые результаты, например:
MariaDB [db1]> SELECT BookID From Book WHERE Author = 'AuthorX';
+--------+
| BookID |
+--------+
| 1003 |
+--------+
MariaDB [db1]> SELECT BookID From Stats WHERE BookID >= 1000;
+--------+
| BookID |
+--------+
| 1010 |
| 1005 |
| 1003 |
+--------+
Но когда я пытаюсь использовать EXCEPT-оператор, я получаю ошибку
MariaDB [db1]> (SELECT BookID From Stats WHERE BookID >= 1000)
-> EXCEPT
-> (SELECT BookID From Book WHERE Author = 'AuthorX');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'EXCEPT (SELECT BookID From Book WHERE Author = 'AuthorX')' at line 1
Что я надеялся получить на выходе:
+--------+
| BookID |
+--------+
| 1010 |
| 1005 |
+--------+
Что я делаю неправильно? Я пробовал с и без кронштейна, но не понял, что попробовать дальше?
РЕДАКТИРОВАТЬ: попробуйте с НЕ В
SELECT BookID From Stats WHERE BookID >= 1000 NOT IN
(SELECT BookID From Book WHERE Author = 'AuthorX');
доходность
+--------+
| BookID |
+--------+
| 3 |
| 1010 |
| 1005 |
| 1003 |
+--------+
РЕДАКТИРОВАТЬ 2: "И BookID NOT IN" для РАБОТЫ, КРОМЕ
Все еще хотел бы знать, почему ИСКЛЮЧЕНИЕ не делает
EDIT3: примеры из https://mariadb.com/kb/en/library/except/ работают...
РЕДАКТИРОВАТЬ 4: MariaDB Версии <10.3 не имеет, КРОМЕ кажется это ответ.
До сих пор удивляюсь, почему примеры работают...
1 ответ
Снимите скобки.
Это выглядит "лучше" на трех линиях...
SELECT `BookID` From `Stats` WHERE `BookID` >= 1000
EXCEPT
SELECT `BookID` From `Book` WHERE `Author` = 'AuthorX'
Это почти так же, как вы можете видеть в UNION ALL
...
SELECT BookID From Book WHERE Title LIKE 'Harry Potter%'
UNION ALL
SELECT BookID From Book WHERE Author LIKE '%Toklien%'
РЕДАКТИРОВАТЬ:
Или просто попробуйте альтернативное выражение (если на более старой версии MariaDB)...
SELECT BookID
FROM Book
WHERE BookID >= 1000
AND BookID NOT IN (SELECT BookID
FROM Book
WHERE Author = 'AuthorX'
)
Или же...
SELECT BookID
FROM Book
WHERE BookID >= 1000
AND NOT EXISTS (SELECT *
FROM Book lookup
WHERE lookup.Author = 'AuthorX'
AND lookup.BookID = Book.BookID
)
Или же...
SELECT
*
FROM
(
SELECT BookID FROM Book WHERE BookID >= 1000
)
high_id
LEFT JOIN
(
SELECT BookID FROM Book WHERE Author = 'AuthorX'
)
target_author
ON target_author.BookID = high_id.BookID
WHERE
target_author.BookID IS NULL