Postgres如何将2个单独的选择查询合并为1个

Posted

技术标签:

【中文标题】Postgres如何将2个单独的选择查询合并为1个【英文标题】:Postgres how can I merge 2 separate select queries into 1 【发布时间】:2016-01-30 20:39:45 【问题描述】:

我正在使用 postgres 9.4,我想将 2 个单独的查询合并到一个语句中。我一直在看这个How to merge these queries into 1 using subquery 帖子,但仍然无法弄清楚如何工作。这两个查询确实独立工作。他们来了

# 1:  select * from votes v where v.user_id=32 and v.stream_id=130;

#2: select city,state,post,created_on,votes,id as Voted from streams 
where latitudes >=28.0363 AND 28.9059>= latitudes  order by votes desc limit 5 ;

我希望查询 #2 被限制为 5,但我不希望查询 #1 包含在该限制中,以便总共可以返回 6 行。这就像一个建议引擎,其中查询 #1 有一个主线程,而查询 #2 最多提供 5 个不同的建议,但它们显然位于不同的表中。

【问题讨论】:

您能否简要说明这两个查询之间的关系。 (一个例子会很棒) 查询不返回一致的结果集架构。如果他们这样做了,您可以使用工会。您要加入表格吗? 【参考方案1】:

在没有模型和数据的情况下,我在 SQL Fiddle 中用两个假人模拟了这个问题。

CREATE TABLE votes
(
   id smallint
   , user_id smallint
);

CREATE TABLE streams
(
   id smallint
   , foo boolean
);

INSERT INTO votes
VALUES (1, 42), (2, 32), (3, 17), (4, 37), (5, 73), (6, 69), (7, 21), (8, 18), (9, 11), (10, 15), (11, 28);

INSERT INTO streams
VALUES (1, true), (2, true), (3, true), (4, true), (5, true), (6, true), (7, false), (8, false), (9, false), (10, false), (11, false);

SELECT
  id
FROM
  (SELECT id, 1 AS sort FROM votes WHERE user_id = 32) AS query_1
  FULL JOIN (SELECT id FROM streams WHERE NOT foo) AS query_2 USING (id)
ORDER BY
  sort 
LIMIT 6;

另外我必须指出,这完全不是我的工作,而是我前几天遇到的answer 的改编。也许这也是一种方法。

那么,发生了什么事?列id 代表您的表和子查询共有的任何列。 votes.user_id我是为了……在一个子查询中选择,在另一个子查询中选择streams.foo

由于您要求最多有 6 行,我使用了两次 limit 子句。首先在子查询中以防万一您不想选择表中有大量行,然后在外部查询中再次限制行数。在这两个限制上稍微摆弄一下,然后切换WHERE fooWHERE NOT foo,你就会明白为什么了。

在第一个子查询中,我添加了一个排序列,就像在该答案中所做的那样。那是因为我猜你希望第一个子查询的结果也总是在最前面。

【讨论】:

太棒了,非常感谢,刚刚试了一下,效果很好

以上是关于Postgres如何将2个单独的选择查询合并为1个的主要内容,如果未能解决你的问题,请参考以下文章

如何将 2 个查询合并为 1 个?

SQL - 如何避免将三个查询合并为一个

Roslyn:如何将多个项目的编译合并为 1 个单独的编译?

将 2 个内部连接结果合并为一个结果

Entity Framework Core:如何将 2 个 COUNT 查询合并为一个

将 2 个单独的 XMLType 记录合并到一个 xml 文件中