SQL-同时限制和过滤联接

时间:2018-09-19 14:57:23

标签: sql postgresql-9.6

我需要以下问题的解决方案。 我有两个表:

ids from new user (got by subquery)

+------------+
|  user_id   |
+------------+
| 1          | 
| 4          | 
| 5          |
+------------+

users (table with all users)
+------------+
|  user_id   |
+------------+
| 1          | 
| 2          | 
| 3          |
| 4          |
| 5          |
| ...        |
+------------+

我需要加入这两个表。每个新用户都需要恰好3 与其他用户的连接。

例如:

+----------+------+
| new_user | user |
+----------+------+
| 1        | 2    |
| 1        | 3    |
| 1        | 4    |
| 4        | 1    |
| 4        | 2    |
| 4        | 3    |
| 5        | 1    |
| 5        | 2    |
| 5        | 3    |
+----------+------+

问题是将条目限制为恰好3 ,并排除多余的条目(例如1 | 1、3 | 3,...)

1 个答案:

答案 0 :(得分:2)

在PostgreSQL中,您可以使用lateral查询来检索子查询中有限数量的行。

我不知道您的主查询或子查询的确切结构,但是它看起来应该像这样:

select t.*, ls.*
  from main_table t,
  lateral ( -- lateral subquery
    select * from secondary_table s
      where s.col1 = t.col2 -- filtering condition, if needed
      fetch first 3 rows only -- limit to a max of 3 rows
  ) ls;

横向子查询在main_table中的每一行执行一次。