Что не так с моим оператором 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
Другие вопросы по тегам