Объединение двух таблиц с ids IN list () ограничивает количество моделей для каждого элемента в списке - PullRequest
0 голосов
/ 10 мая 2018

У меня есть 2 модели A, B. B имеет ForeignKey для A

A

id | name | sec_id    
1    char     5    
2    char     5       
3    char     7 
4    char     5 
5    char     6 
6    char     6 
7    char     6 

B

id | name      | a_id other   
1    char1-1      1    -     
2    char1-2      1    -    
3    char2-1      2    -
4    char2-2      2    -
5    char3-1      3    -

Я хочу:

  • получить до 2 элементов A на каждый sec_id из списка sec_id ->

-> Например, если sec_id_list=(5,7), я получу Aсоответствует id 1,2 для sec_id 5 и 3 для sec_id 7, ничего для sec_id 6)

  • для каждого элемента A получить первый соответствующий элемент B

    id name_Asec_id name_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, но мне не удалось ограничить число двумя длякаждый sec_id в списке IN

1 Ответ

0 голосов
/ 12 мая 2018

Вместо прямого выбора из A или B замените их подзапросом, выбрав строки с наименьшими двумя или одним идентификатором для sec_id или a_id.Это можно сделать, проверив, меньше или равно число строк с более низкими или равными идентификаторами соответствующим пределом.Слева присоедините замену A с заменой B и поместите список желаемых sec_id в WHERE, как вы уже сделали.

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 был предоставлен.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...