Ошибка синтаксиса SQL при использовании INTERSECT в запросе UPDATE

У меня есть два запущенных запроса: один для поиска совпадений в базе данных, а второй запрос, который затем обновляет столбец в базе данных. Запросы точно такие же, за исключением того, что один является оператором SELECT, а другой — оператором UPDATE. Синтаксис в предложении WHERE одинаков в обоих запросах, и оператор SELECT находит все правильные результаты без проблем или синтаксических ошибок. Второй запрос дает эту ошибку:

ОШИБКА: рядом с "INTERSECT": синтаксическая ошибка

:

Это запрос SELECT:

SELECT * FROM StudentInfo 
    WHERE FirstLanguageToOffer = 'French' 
    OR SecondLanguageToOffer = 'French'
    OR ThirdLanguageToOffer = 'French'
    INTERSECT 
    SELECT * FROM StudentInfo WHERE Gender = 'Female'
    INTERSECT
    SELECT * FROM StudentInfo WHERE MaxPartners > CurrentPartners
    INTERSECT
    SELECT * FROM StudentInfo WHERE Preference ='Male' OR Preference = 'It doesnt matter'
    INTERSECT
    SELECT * FROM StudentInfo WHERE LanguageToPractice ='English'
    ORDER BY Priority
    LIMIT 1;

Это запрос ОБНОВЛЕНИЯ:

UPDATE StudentInfo SET CurrentPartners = CurrentPartners -1  
    WHERE FirstLanguageToOffer = 'French' 
    OR SecondLanguageToOffer = 'French'
    OR ThirdLanguageToOffer = 'French'
    INTERSECT 
    SELECT * FROM StudentInfo WHERE Gender = 'Female'
    INTERSECT
    SELECT * FROM StudentInfo WHERE MaxPartners > CurrentPartners
    INTERSECT
    SELECT * FROM StudentInfo WHERE Preference ='Male' OR Preference = 'It doesnt matter'
    INTERSECT
    SELECT * FROM StudentInfo WHERE LanguageToPractice ='English'
    ORDER BY Priority
    LIMIT 1;

Кто-нибудь знает, что может вызвать эту проблему? Операции INTERSECT не поддерживаются в запросах UPDATE? Я использую SQLite.


person MikeyJ    schedule 22.03.2017    source источник


Ответы (1)


INTERSECT не имеет никакого значения с точки зрения обновлений. Ваш запрос SELECT на самом деле представляет собой пять независимых запросов, выполняемых одновременно, чтобы вернуть пересечение пяти независимых наборов результатов. Поскольку UPDATE не генерирует результирующий набор, попытка пересечь нерезультат с результатами SELECT запросов является ошибкой.

Кажется, что ваша первоначальная цель была бы лучше достигнута с помощью одного запроса SELECT со сложным предложением WHERE, поскольку каждый из пяти запросов выполняется для одной и той же таблицы, проверяя разные условия.

person dmfay    schedule 22.03.2017
comment
Ааааа, спасибо, это логично. Я перепишу заявление так, чтобы это было одно ГДЕ. Ради интереса, могу ли я использовать INTERSECT, если у меня есть несколько операций UPDATE? - person MikeyJ; 23.03.2017
comment
Нет. INTERSECT, UNION, EXCEPT и т. д. — это математические операции, которые работают только с множествами, а то, как вы описываете множество в SQL, — это SELECT. Попытка найти пересечение не-множеств подобна попытке умножить предложения. - person dmfay; 23.03.2017