Есть ли способ объединить использование Postgresql с дополнительным предложением? - PullRequest
0 голосов
/ 25 мая 2018

Предположим, у вас есть таблицы A и B:

CREATE TABLE A (
   id1
   id2
   creationDate
   ...
);

CREATE TABLE B (
   id1
   id2
   lastUsedDate
   ...
);

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

Если вы хотите присоединиться только к первым двум столбцам, вы можете выполнить этот запрос:

SELECT 
     id1
   , id2
   , ...
FROM A
JOIN B using(id1, id2)
;

Однако, если вы также хотите присоединиться к дате, вы вынуждены выполнить этот запрос:

SELECT 
     a.id1
   , a.id2
   , ...
FROM A a
JOIN B b ON 
        a.id1=b.id1
    AND a.id2=b.id2
    AND a.creationDate=b.lastUsedDate
;

Этот запрос гораздо более многословен, и если вы опустите a.id1 и вместо этого воспользуетесь id1, postgres пожалуется, что id1 неоднозначно, несмотря на то, чточто, поскольку вы используете INNER JOIN, столбец не может быть неоднозначным.

Есть ли способ объединить функциональность using() и дополнительного столбца, который не имеет того же имени?Или вы вынуждены использовать дополнительное многословие в последнем примере.

Ответы [ 2 ]

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

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

WITH tablea (a, b, c1) AS (
VALUES (1, 'x', 'y')
     , (2, 'x', 'z')
     , (3, 'y', 'z')
), tableb (a,b,c2) AS (
VALUES (1, 'x', 'y')
     , (2, 'x', 'z')
     , (3, 'y', 'z')
)
SELECT * 
FROM tablea AS t(a,b,c2)
JOIN tableb USING (a, b, c2)

но я бы предложил поместить третье условие в предложение where, как Гордон Линофф & dnoeth предлагает

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

Вы можете использовать подзапрос, CTE или боковое соединение, чтобы добавить столбцы с одинаковыми именами:

FROM A a JOIN
     (SELECT b.*, lastUsedDate as creationDate
      FROM B b
     ) b
     USING (id1, id2, creationDate)

Или добавить дополнительное условие к предложению WHERE:

FROM A a JOIN
     B b
     USING (id1, id2)
WHERE a.creationDate = b.lastUsedDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...