Многократное соединение SQL из одной строки со строкой - PullRequest
0 голосов
/ 03 мая 2018

У меня есть две таблицы, как это:

table1
id(int) | desc(TEXT)
--------------------
     0  | "desc1"
     1  | "desc2"

table2
id(int) | table1_id(TEXT)
------------------------
     0  | "0"
     1  | "0;1"

Я хочу выбрать данные в table2 и заменить table1_id полем desc в table1, когда у меня есть строка с ';' разделитель это означает, что у меня есть несколько вариантов выбора.

Я могу сделать это для одного выбора, как это

SELECT table1.desc 
FROM table2 LEFT JOIN table1 ON table1.id = CAST(table2.table1_id as integer);

Требуется вывод с SELECT на table2, где id = 1:

"desc"
------
"desc1, desc2"

Я использую Postgresql10, python3.5 и sqlalchemy

Я знаю, как сделать это, извлекая данные и обрабатывая их с помощью Python, а затем снова запрашивая, но я ищу способ сделать это одним SQL-запросом.

PS: я не могу изменить таблицу2.

Ответы [ 2 ]

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

Это действительно отвратительный дизайн данных.

Следовательно, вам придется написать сложный запрос, чтобы получить желаемый результат:

SELECT string_agg(table1."desc", ', ')
FROM table2
   CROSS JOIN LATERAL regexp_split_to_table(table2.table1_id, ';') x(d)
   JOIN table1 ON x.d::integer = table1.id
WHERE table2.id = 1;

  string_agg  
--------------
 desc1, desc2
(1 row)
0 голосов
/ 03 мая 2018

Вы можете преобразовать значение CSV в массив, а затем присоединиться к нему:

select string_agg(t1.descr, ',') as descr
from table2 t2 
  join table1 t1 on t1.id = any (string_to_array(t2.table1_id, ';')::int[])
where t2.id = 1  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...