【问题标题】:Using UNION inside of NOT IN在 NOT IN 中使用 UNION
【发布时间】:2014-08-05 21:19:04
【问题描述】:

我正在尝试使用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
    )   
)

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

【问题讨论】:

    标签: mysql sql subquery union notin


    【解决方案1】:

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

    【讨论】:

    • 是的,就是这样。我想我可以以任何我想对查询进行分组的方式使用括号。学到了新东西:)。
    • @Yasir,这个错误(从第二次出现AS id)发生在哪个版本?我无法在 SQLFiddle 中重现它。另外,这两个DISTINCT 是多余的,因为UNION 默认具有UNION DISTINCT,并且无论如何都会删除所有重复项。
    • @ypercube 我想我将多次出现的列别名与集合运算符中除最后一个查询之外的任何查询中指定的ORDER BY 子句混淆了,即。 e.这个查询给出了一个错误select 'foo' from dual order by 1 union select 'bar' from dual,而这不是select 'foo' from dual union select 'bar' from dual order by 1。更新了答案。
    【解决方案2】:

    @yasir 其实,这并不是一个真正的语法问题(同样的语法被其他 SQL 数据库接受),而是 MySQL 查询解析器的一个限制,implemented using the bison parser generator

    该错误源于解析器需要在两个可能的解析树之间做出决定,因为 SELECT 子查询和子表达式都可能包含在括号中。因此,这里的最小解决方案是从第一个子查询中删除括号 only,即:

    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 消除两种可能的解析树之间的歧义。在野牛行话中,这将避免移位/减少冲突。

    【讨论】:

      猜你喜欢
      • 2013-08-24
      • 2014-04-22
      • 1970-01-01
      • 2019-12-24
      • 2017-09-18
      • 2016-02-11
      • 2017-11-26
      • 2021-05-18
      • 1970-01-01
      相关资源
      最近更新 更多