1

我正在尝试使用NOT IN条件进行查询。如果我使用子查询,我没有问题,但是当我尝试使用UNION连接两个表的结果时,我得到了一个错误。

这就是我正在做的事情:

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
    )   
)

有没有办法使用子查询来获得我想要的东西?

4

2 回答 2

5

我认为您的代码中存在语法问题。您是否尝试放入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 的评论)。

于 2014-08-05T21:21:44.450 回答
0

@yasir 实际上,这不是一个真正的语法问题(其他 SQL 数据库接受相同的语法),而是 MySQL 查询解析器的限制,使用 bison 解析器生成器实现

该错误源于解析器需要在两个可能的解析树之间做出决定,因为 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 消除两种可能的解析树之间的歧义。在野牛行话中,这将避免转移/减少冲突。

于 2017-08-19T16:51:04.200 回答