Получить строки из таблиц по первичному ключу в порядке заданных списков идентификаторов? - PullRequest
1 голос
/ 15 марта 2019

Для заданного списка первичных ключей (с одним столбцом идентификатора в качестве первичного ключа) я хочу получить строки, относящиеся к этим идентификаторам, в порядке из базы данных. Если идентификатор не существует в базе данных, тогда эта конкретная строка должна быть нулевой.

У меня есть два таких списка одинаковой длины для двух разных таблиц в базе данных. Я хочу выполнить параллельное соединение двух таблиц (если возможно, на стороне сервера).

У нас есть два списка идентификаторов: [1, 2, 3, 4] и [3, 2, 4, 1].
Запрос с использованием первого списка в первой таблице извлекает:

 id    c1
----  ----
 1     a
 2     b
 3     c
 4     d

Запрос с использованием второго списка во второй таблице:

 id    c2
----  ----
 3     g
 2     h
 4     i
 1     j

Окончательный результат должен быть:

 c1    c2
----  ----
 a     g
 b     h
 c     i
 d     j

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Предоставьте списки в виде массивов и отсоедините параллельно:

SELECT t1.c1, t2.c2
FROM   unnest ('{1, 2, 3, 4}'::int[]
             , '{3, 2, 4, 1}'::int[]) AS i(id1, id2)
LEFT   JOIN tbl1 t1 ON t1.id = i.id1
LEFT   JOIN tbl2 t2 ON t2.id = i.id2;

Использование 2x LEFT JOIN гарантирует, что каждый индекс будет представлен в выходных данных, даже если строка не найдена водна или обе таблицы - тогда вместо этого вы получите значения NULL.

Предполагая, что id столбцы tbl1 & tbl2 равны UNIQUE, или это может создать «перекрестное соединение через прокси».См .:

Если вы также хотите сохранить порядок сортировки, добавьте WITH ORDINALITY:

SELECT t1.c1, t2.c2
FROM   unnest ('{1, 2, 3, 4}'::int[]
             , '{3, 2, 4, 1}'::int[]) WITH ORDINALITY i(id1, id2, ord)
LEFT   JOIN tbl1 t1 ON t1.id = i.id1
LEFT   JOIN tbl2 t2 ON t2.id = i.id2
ORDER  BY ord;

См .:

0 голосов
/ 15 марта 2019

Пожалуйста, попробуйте это

SELECT AA.C1,BB.C2 FROM (
(SELECT ROW_NUMBER() OVER(ORDER BY a.id) As row_num, * FROM @tbl1 A ) AS AA
INNER JOIN
(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) As row_num, * FROM @tbl2 A) AS BB
ON AA.row_num =BB.row_num)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...