2014-08-05 3 views
1

Я пытаюсь сделать запрос, используя условие NOT IN. Если я использую подзапрос, у меня нет проблем, но когда я пытаюсь использовать UNION для объединения результатов из двух таблиц, у меня есть ошибка.Использование UNION внутри NOT IN

Это то, что я делаю:

SELECT * 
FROM users 
WHERE id NOT IN( 
    (
     SELECT DISTINCT(user_id) AS id 
     FROM users_table_1 
    ) 
    UNION 
    (
     SELECT DISTINCT(user_id) AS id 
     FROM users_table_2 
    ) 
) 

Есть ли способ, чтобы получить то, что я хочу с помощью подзапросов?

ответ

2

Я думаю, что в вашем коде есть проблема с синтаксисом. Вы пытались поставить UNIONвнутри подзапрос?

SELECT * 
FROM users 
WHERE id NOT IN( 
     SELECT user_id AS id 
     FROM users_table_1 
     UNION 
     SELECT user_id 
     FROM users_table_2 
) 

DISTINCT ключевое слово является излишним (см комментарий @ ypercube в).

+0

Да, это было так. Я думал, что могу использовать круглые скобки, чтобы связать свои запросы. Новая вещь научилась :). – kunde

+1

@ Yasir, какая версия делает эту ошибку (от второго появления «AS id»)? Я не могу воспроизвести его в SQLFiddle. Кроме того, два 'DISTINCT' являются избыточными, поскольку' UNION' имеет по умолчанию 'UNION DISTINCT' и в любом случае удалит все дубликаты. –

+0

@ypercube Я думаю, что я смутил имя псевдонима столбца, появляющееся более одного раза с предложением 'ORDER BY', указанным в любом запросе, отличном от последнего в операторе set, i. е. этот запрос дает ошибку 'select 'foo' от двойного порядка на 1 union select 'bar' от double', в то время как это не' select 'foo' из двойного объединения select bar для двойного порядка на 1'. Обновлен ответ. –

0

@ yasir На самом деле, это не проблема синтаксиса (тот же синтаксис принят другими базами данных SQL), а скорее ограничение в синтаксисе запросов MySQL, implemented using the bison parser generator.

Ошибка возникает из-за необходимости анализа пар между двумя возможными деревьями синтаксического анализа, поскольку оба подзаголовка SELECT и подвыражения могут быть заключены в круглые скобки. Поэтому минимальное решение здесь было бы удалить скобки только из первого подзапроса, т.е .:

SELECT * 
FROM users 
WHERE id NOT IN( 
    SELECT user_id AS id 
    FROM users_table_1 
    UNION 
    (
     SELECT user_id 
     FROM users_table_2 
    ) 
) 

Таким образом, вы «помочь» MySQL неоднозначность между двумя возможными деревьев синтаксического анализа. В бизон-жаргоне это позволит избежать конфликта смены/сокращения.