Получение ошибки при использовании предложения EXCEPT - PullRequest
0 голосов
/ 14 ноября 2018

enter image description here

Прикрепленный выше вопрос, который я пытаюсь решить. Для начала я хотел попробовать использовать предложение EXCEPT в SQL и получить все значения, которых нет в таблице Orders. Это то, что я пытаюсь: (пока игнорируйте имена столбцов и прочее, я просто хочу проверить логику EXCEPT)

SELECT Id, Name FROM Customers
EXCEPT
SELECT O.CustomerId as Id, C.Name AS Name FROM Customers C , Orders O
WHERE C.Id = O.CustomerId

Однако, я получаю эту ошибку на LeetCode, в которой я не уверен:

Line 3: SyntaxError: near 'SELECT O.CustomerID as Id, C.Name AS Name FROM Customers C , Orders O WHERE C.Id'

Ожидаемый вывод из запроса, который я написал:

Id    Name
2     Henry
4     Max

РЕДАКТИРОВАТЬ: Это проблема на LeetCode, и после просмотра, какую версию он использует, я обнаружил, что это MySQL-сервер 5.7.21

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Если вы настаиваете на использовании EXCEPT, сделайте это EXCEPT ALL:

SELECT Id FROM Customers
EXCEPT ALL
SELECT CustomerID FROM Orders;

Но я бы лучше использовал LEFT JOIN / .. IS NULL:

SELECT C.*
FROM   Customers C
LEFT   JOIN Orders O ON O.CustomerId = C.Id
WHERE  O.CustomerId IS NULL;

См:

0 голосов
/ 14 ноября 2018

Я видел, что ваша база данных - это mysql.Mysql не поддерживает EXCEPT

Другой способ использования NOT IN будет проще, чем EXCEPT

Схема (MySQL v5.7)

CREATE TABLE  Customers(
   id int,
   Name varchar(50)
);

INSERT INTO Customers VALUES (1,'Joe');
INSERT INTO Customers VALUES (2,'Henry');
INSERT INTO Customers VALUES (3,'Sam');
INSERT INTO Customers VALUES (4,'Max');

CREATE TABLE  Orders(
   id int,
   CustomerId int
);

INSERT INTO Orders VALUES (1,3);
INSERT INTO Orders VALUES (2,1);

Запрос № 1

SELECT Id, Name 
FROM Customers
WHERE Id NOT IN (
   SELECT O.CustomerID
   FROM Orders O 
);

| Id  | Name  |
| --- | ----- |
| 2   | Henry |
| 4   | Max   |

Просмотр на БД Fiddle

Есливаша база данных поддерживает EXCEPT, я бы использовал JOIN вместо , для соединения двух таблиц, потому что JOIN имеет более четкое семантическое значение для соединения двух таблиц.

SELECT Id, Name 
FROM Customers
EXCEPT
SELECT O.CustomerID as Id, C.Name AS Name
FROM Customers C JOIN Orders O ON C.Id = O.CustomerID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...