首页 > 解决方案 > 一个表中的所有值 UNION SELECT TOP N 来自另一个表的值

问题描述

新手在这里 - 目前我有这个 MySQL 查询:

SELECT {cols}
FROM calibrator_list
UNION SELECT {cols}
FROM target_list
WHERE ({ra_min} < ra  AND ra < {ra_max}) AND
      ({dec_min} < decl AND decl < {dec_max})

正如预期的那样,这产生了 和 的target_list并集calibrator_list。如果满足要求,我希望查询生成一个表,其中包含来自 的所有值target_list,但只有来自 的最大单个值;这可以是列表中的随机值或按任意列排序,只要生成的表中只有一个条目。calibrator_listWHEREcalibrator_list

我试过了:

SELECT {cols}
FROM calibrator_list
WHERE ({ra_min} < ra  AND ra < {ra_max}) AND
      ({dec_min} < decl AND decl < {dec_max})
LIMIT 1
UNION SELECT {cols}
FROM target_list
WHERE ({ra_min} < ra  AND ra < {ra_max}) AND
      ({dec_min} < decl AND decl < {dec_max})

但这会引发语法错误,据说是关于该UNION SELECT {cols}行的,如果我省略该行,则该错误不存在LIMIT 1。关于如何实现这一目标的任何想法?

标签: mysqlsql

解决方案


做你想做的事,你需要括号:

(SELECT {cols}
 FROM calibrator_list
 LIMIT 1
) UNION
SELECT {cols}
FROM target_list
WHERE ({ra_min} < ra  AND ra < {ra_max}) AND
      ({dec_min} < decl AND decl < {dec_max})

两个注意事项:

  1. 您通常使用LIMITwith ORDER BY。否则返回的行是任意的,并且可以(理论上)因运行而异。
  2. UNION ALL比 更有效UNION。您没有指定是否要承担删除重复项的开销。如果您需要这样做,那么您需要较慢的查询并使用UNION.

推荐阅读