在Postgres中,如何结合使用LIMIT语句来合并两个SQL查询?

49

我有一张表,希望能够查询出最后创建的十条记录,并包含ID为x的记录。

我的尝试:

SELECT * FROM catalog_productimage
ORDER BY date_modified
LIMIT 10
UNION
SELECT * FROM catalog_productimage
WHERE id=5;

但是看起来我无法在UNION之前放置LIMIT。我尝试添加另一列并使用它进行排序 -

SELECT id, date_modified, IF(false, 1, 0) as priority FROM catalog_productimage
UNION
SELECT, id, date_modified, IF(true, 1, 0) as priority FROM catalog_productimage
WHERE id=5
ORDER BY priority, date_modified
LIMIT 10;

但是我没有取得太多进展。

2个回答

89

刚刚检查过,这将会起作用:

(SELECT * FROM catalog_productimage
ORDER BY date_modified
LIMIT 10)
UNION
SELECT * FROM catalog_productimage
WHERE id=5;

我差点就做到了!谢谢! - Aidan Ewen
1
谢谢您,很奇怪为什么没有括号就不能正常工作。 - Sanjiv Jivan
4
需要使用圆括号,因为UNION实际上是选择语句的一部分,而选择语句的语法要求LIMIT必须在UNION之后。因此,您需要显式结束第一个表达式。由于这个语法要求,您需要在UNION的末尾使用LIMIT。这样,LIMIT将应用于联合的结果。有关更多详细信息,请参阅选择文档 - Mr. Deathless
那么如果我们有三个联合操作需要执行,这是否需要为每个联合操作创建一个新的括号集? - Adam Hughes

1

这将为您提供从第10条到第20条的记录,并应该让您开始。我会回复您SQLfiddle。

SELECT *  
  FROM (SELECT ROW_NUMBER () OVER (ORDER BY cat_id) cat_row_no, a.* FROM catalog_productimage a where x=5)  
 WHERE cat_row_no > 10 and cat_row_no <20  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接