Sql 2个表连接,ID在list()中,限制列表中每个元素的模型数

Sql 2个表连接,ID在list()中,限制列表中每个元素的模型数,sql,postgresql,Sql,Postgresql,我有两个型号A,B。B有A的外键 A B 我想: 从sec_id列表中获取每个sec_id最多2个元素-> ->例如,如果sec_id_list=5,7,我将获得sec_id 5对应的id 1,2和sec_id 7对应的id 3,sec_id 6不对应任何内容 对于每个A元素,获取第一个对应的B元素 id名称\u A秒\u id名称\u B 1 char 5 char1-1 2 char 5 char1-2 3 char 7 char

我有两个型号A,B。B有A的外键

A

B

我想:

从sec_id列表中获取每个sec_id最多2个元素-> ->例如,如果sec_id_list=5,7,我将获得sec_id 5对应的id 1,2和sec_id 7对应的id 3,sec_id 6不对应任何内容

对于每个A元素,获取第一个对应的B元素

id名称\u A秒\u id名称\u B

1  char     5      char1-1
2  char     5      char1-2 
3  char     7      char1-3
我首先说:

SELECT A.id, A.name, A.sec_id, B.name FROM A 
LEFT JOIN (SELECT a_id, name, FROM B) ON B.sec_id=A.id WHERE  P.sec_id IN (5,7)
我尝试使用count或Distinct ON,但未能将in列表中每个sec_id的数字限制为两个,而不是直接从A或B中选择,将它们替换为子查询,选择每秒两个或一个id或一个id最低的行。这可以通过检查id较低或相等的行数是否小于或等于相应的限制来完成。左键将A替换项与B替换项连接起来,并将通缉犯id列表放在何处,就像您已经做的那样

SELECT a.id,
       a.name,
       a.sec_id,
       b.name
       FROM (SELECT *
                    FROM A ai
                    WHERE (SELECT ai.id,
                                  ai.name,
                                  ai.sec_id
                                  FROM A aii
                                  WHERE aii.sec_id = aii.sec_id
                                        AND aii.id <= ai.id) <= 2) a
            LEFT JOIN (SELECT bi.a_id,
                              bi.name
                              FROM B bi
                              WHERE (SELECT count(*)
                                            FROM B bii
                                            WHERE bii.a_id = bi.a_id
                                                  AND bii.id <= bi.id) <= 1) b
                      ON b.a_id = a.id
       WHERE a.sec_id IN (5,
                          7);

未测试,因为未提供DDL或DML。

编辑您的问题并显示您想要的结果。@GordonLinoff-请参阅“我想要:部分”。现在更清楚了吗?如果没有,还有什么不清楚?
SELECT A.id, A.name, A.sec_id, B.name FROM A 
LEFT JOIN (SELECT a_id, name, FROM B) ON B.sec_id=A.id WHERE  P.sec_id IN (5,7)
SELECT a.id,
       a.name,
       a.sec_id,
       b.name
       FROM (SELECT *
                    FROM A ai
                    WHERE (SELECT ai.id,
                                  ai.name,
                                  ai.sec_id
                                  FROM A aii
                                  WHERE aii.sec_id = aii.sec_id
                                        AND aii.id <= ai.id) <= 2) a
            LEFT JOIN (SELECT bi.a_id,
                              bi.name
                              FROM B bi
                              WHERE (SELECT count(*)
                                            FROM B bii
                                            WHERE bii.a_id = bi.a_id
                                                  AND bii.id <= bi.id) <= 1) b
                      ON b.a_id = a.id
       WHERE a.sec_id IN (5,
                          7);