Упрощение кода с помощью вложенных соединений в предложении WHERE - PullRequest
0 голосов
/ 26 апреля 2019

Я пишу SQL-оператор в PostgreSQL, где я присоединяюсь к данным из разных таблиц, каждая из которых связана внешними ключами в своих идентификаторах.В таблице b есть поле a_id, которое относится к идентификатору таблицы a и т. Д.

Моя проблема заключается в том, что я хочу повторно использовать значение из объединенной таблицы в предложении WHERE без необходимости повторного выполнения всех соединений.вот так:

SELECT *
FROM a
INNER JOIN b ON b.a_id = a.id
INNER JOIN c ON c.b_id = b.id
WHERE a.id = 3
AND a.x =
    (SELECT c.y
    FROM a
    INNER JOIN b ON b.a_id = a.id
    INNER JOIN c ON c.b_id = b.id
    WHERE a.id = 3
    AND c.id = 5)

Могу поспорить, есть более простое решение для этого фрагмента, которое я просто не понимаю.Я буду рад, если кто-нибудь сможет мне помочь.

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

У меня нет ответа «серебряная пуля», который упрощает ваш запрос, но CTE, безусловно, может сделать его немного проще для глаз:

WITH cte AS (
    SELECT *
    FROM a
    INNER JOIN b ON b.a_id = a.id
    INNER JOIN c ON c.b_id = b.id
    WHERE a.id = 3
)

SELECT *
FROM cte
WHERE x IN (SELECT y FROM cte WHERE c_id = 5);

Мои псевдонимы или имена столбцов могут быть отключены, и вам, возможно, придется немного привести в порядок CTE, прежде чем он действительно будет работать для вас.

1 голос
/ 26 апреля 2019

Для этого вы можете использовать оконные функции:

SELECT . . .
FROM (SELECT a.*, b.*, c.*,  -- should  list the columns explicitly
             MAX(c.y) FILTER (WHERE c.id = 5) OVER () as y_5
      FROM a INNER JOIN
           b
           ON b.a_id = a.id INNER JOIN
           c
           ON c.b_id = b.id
      WHERE a.id = 3
    ) abc
WHERE abc.x = abc.y_5;
0 голосов
/ 26 апреля 2019

Надеюсь, что приведенный ниже запрос поможет вам.

SELECT *
FROM a
INNER JOIN b ON b.a_id = a.id
INNER JOIN c ON c.b_id = b.id
WHERE a.id = 3 and c.id =5 and a.x = c.y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...