合并两个表时出现SQL UNION错误消息

问题描述 投票:0回答:2

我解决了一个 SQL 问题: 表:我的号码

+-------------+------+ |栏目名称 |类型 | +-------------+------+ |编号 |整数 | +-------------+------+ 该表没有主键。它可能包含重复项。 该表的每一行都包含一个整数。

单个号码是指在 MyNumbers 表中仅出现一次的号码。

编写一个 SQL 查询来报告最大的单个数字。如果没有单个号码,则报空。

示例1:

输入: 我的号码表: +-----+ |编号 | +-----+ | 8 | | 8 | | 3 | | 3 | | 1 | | 4 | | 5 | | 6 | +-----+ 输出: +-----+ |编号 | +-----+ | 6 | +-----+ 说明:单个数字是 1、4、5 和 6。 由于 6 是最大的单个数字,因此我们返回它。

我尝试使用UNION来解决这个问题:

选择号码 来自我的号码 按数字分组 有计数(num)=1 按编号 DESC 排序 联合所有 选择 NULL 作为数字 限制1

这是我的想法: 如果存在单个数字,则返回最大的数字。如果没有单个数字,则返回 NULL。

但是编译器显示了错误消息: 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在“UNION ALL”附近使用的正确语法 选择 NULL 作为数字 第 7 行 LIMIT 1'

我是SQL新手,不知道问题出在哪里。有人可以帮忙吗?谢谢!

sql union
2个回答
0
投票

当您有 UNION 查询时,ORDER BY 子句需要位于所有联合 SELECT 语句的末尾。

例如。

SELECT 
  num
FROM MyNumbers 
GROUP BY num 
HAVING COUNT(num)=1 
UNION ALL 
SELECT
  NULL AS num
ORDER BY num DESC    <-- ORDER BY goes here, after all UNIONs
LIMIT 1

0
投票

问题是您正在尝试

ORDER BY
LIMIT
UNION
的第一部分,但语法不允许,所以您可以尝试这个,

SELECT IFNULL(
    (SELECT num
     FROM MyNumbers
     GROUP BY num
     HAVING COUNT(num) = 1
     ORDER BY num DESC
     LIMIT 1),
    NULL
) AS num;

这里内部

SELECT
的部分将找到最高的num,它只会出现一次,如果有任何数字,SELECT部分将不返回任何行,IFNULL函数会将其转换为
NULL
,希望是这样有帮助,

© www.soinside.com 2019 - 2024. All rights reserved.