Соединение SQL-запросов из таблицы 1 и таблицы 2

#postgresql

Вопрос:

Даны две таблицы t1 и t2 с одинаковыми именами столбцов:

места, посещения и типы событий

В выходной таблице должны быть места в первом столбце. Во втором столбце должны быть types_of_events из t2.

Комментарии:

1. Я удалил конфликтующие теги СУБД. Пожалуйста, добавьте только один тег для продукта базы данных, который вы действительно используете.

2. Когда вы говорите «количество идентификаторов», вы имеете в виду «количество различных идентификаторов»? Другими словами, должен ли результат содержать (A, 3, 2) или (A, 2, 2)?

3. Отметьте свой вопрос в базе данных, которую вы используете!

Ответ №1:

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

 SELECT
    var1,
    COUNT(CASE WHEN src = 1 THEN 1 END) AS cnt_1,
    COUNT(CASE WHEN src = 2 THEN 1 END) AS cnt_2
FROM
(
    SELECT var1, id, 1 AS src FROM t1
    UNION ALL
    SELECT var1, id, 2 FROM t2
) t
GROUP BY
    var1;
 

Для объяснения запрос внутреннего объединения объединяет два набора данных, однако вводит src столбец 1 или 2, соответствующий источнику таблицы. Затем во внешнем запросе мы агрегируем var1 и берем отдельные условные подсчеты идентификаторов для каждой таблицы.

Комментарии:

1. @gocode Пожалуйста, проверьте объяснение, данное в конце ответа.

Ответ №2:

Я бы использовал union all , но с этим поворотом:

 select var1, sum(cnt1), sum(cnt2)
from ((select var1, count(*) as cnt1, 0 as cnt2
       from t1
       group by var1
      ) union all
      (select var1, 0, count(*)
       from t2
       group by var1
      )
     ) t
group by var1;
 

Идея состоит в том, что, повторяя столбцы, вы можете избежать case во внешнем запросе. Вы также можете написать это с помощью full join . В стандартном SQL это выглядит так:

 select *
from (select var1, count(*) as cnt1, 0 as cnt2
      from t1
      group by var1
     ) t1 full join
     (select var1, 0, count(*)
      from t2
      group by var1
     )
     using (var1);
 

Однако не все базы данных поддерживают этот синтаксис.

Комментарии:

1. @gocode . . . Нужен для чего? Если у вас есть другой вопрос, задайте новый вопрос с соответствующими образцами данных, желаемыми результатами и объяснениями.

Ответ №3:

Это дает вам количество различных идентификаторов (для каждой таблицы), связанных с каждым уникальным var1:

 SELECT
    COALESCE(t1.var1, t2.var1) var1,
    COUNT(DISTINCT t1.id) count1,
    COUNT(DISTINCT t2.id) count2
FROM
    t1
    FULL JOIN t2
        ON t1.var1 = t2.var1
GROUP BY
    COALESCE(t1.var1, t2.var1);
 

Результат:

var1 количество 1 количество 2
A 2 2
B 1 4
C 2 1
D 0 1