我的 SQL-EXCEPT-Operator 有什么问题?
What's wrong with my SQL-EXCEPT-Operator?
当我从我的表 "Stats" 和 "Book" select "BookID" 中获得所需的结果时,我分别得到如下结果:
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 |
+--------+
我做错了什么?
我试过带支架和不带支架,但不知道接下来要尝试什么?
编辑:尝试使用 NOT IN
SELECT BookID From Stats WHERE BookID >= 1000 NOT IN
(SELECT BookID From Book WHERE Author = 'AuthorX');
产量
+--------+
| BookID |
+--------+
| 3 |
| 1010 |
| 1005 |
| 1003 |
+--------+
EDIT2:"AND BookID NOT IN" EXCEPT 作品
仍然很想知道为什么 EXCEPT 不
EDIT3:来自 https://mariadb.com/kb/en/library/except/ 的示例确实有效……
EDIT4:MariaDB Vers<10.3 没有 EXCEPT 似乎是 是答案。
仍然想知道为什么示例有效...
删除括号。
看起来 "nicer" 三行...
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
当我从我的表 "Stats" 和 "Book" select "BookID" 中获得所需的结果时,我分别得到如下结果:
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 |
+--------+
我做错了什么? 我试过带支架和不带支架,但不知道接下来要尝试什么?
编辑:尝试使用 NOT IN
SELECT BookID From Stats WHERE BookID >= 1000 NOT IN
(SELECT BookID From Book WHERE Author = 'AuthorX');
产量
+--------+
| BookID |
+--------+
| 3 |
| 1010 |
| 1005 |
| 1003 |
+--------+
EDIT2:"AND BookID NOT IN" EXCEPT 作品
仍然很想知道为什么 EXCEPT 不
EDIT3:来自 https://mariadb.com/kb/en/library/except/ 的示例确实有效……
EDIT4:MariaDB Vers<10.3 没有 EXCEPT 似乎是 是答案。
仍然想知道为什么示例有效...
删除括号。
看起来 "nicer" 三行...
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