#sql #postgresql #join #union #distinct
#sql #postgresql #Присоединиться #объединение #distinct
Вопрос:
Я пытаюсь написать запрос, который будет объединять исторические данные о встречах с данными о встречах, обновляемыми в реальном времени.
Данные текущего обновления и исторические данные имеют все общие заголовки столбцов и типы данных.
Набор исторических данных представляет собой статический снимок 100-150 тыс. строк данных, которые я пытаюсь ОБЪЕДИНИТЬ с данными, обновляемыми в реальном времени, для создания полного набора данных
Поскольку существует некоторое совпадение между данными текущего обновления и историческими данными, я хочу отфильтровать отдельные идентификаторы встреч
Вот запрос, который я написал:
SELECT
DISTINCT(n.appointment_id)
FROM (
SELECT
* FROM note_data
UNION
SELECT * FROM note_data_historical) as n
FULL OUTER JOIN note_data_historical as historical
on historical.appointment_id = n.appointment_id
FULL OUTER JOIN note_data as live
on live.appointment_id = n.appointment_id
Что я пытаюсь сделать, так это избежать необходимости выписывать пару десятков заголовков столбцов, но при этом не иметь повторяющихся строк.
Итак, подводя итог, я хотел бы:
- Соедините два набора данных с перекрывающимися строками, чтобы получить полный набор данных
- Отфильтровывать перекрывающиеся строки
- Отобразите все столбцы (например, ВЫБЕРИТЕ *, сгруппированные по или объединенные в один столбец)
Комментарии:
1. Пожалуйста, предоставьте примеры данных и желаемые результаты.
2. Итак, идея в том, что вы хотите note_data.* объединенный с note_data_historical .* если note_data_historical.appointment_id не существует в note_data?
3. ОБЪЕДИНЕНИЕ гарантирует уникальность каждой строки в результирующем наборе. Это не то же самое, что удаление дубликатов в каком-либо конкретном столбце или наборе столбцов. Если какой-либо столбец отличается, то строка уникальна. Если вам нужна уникальность для определенных столбцов, перестаньте лениться и укажите необходимые столбцы или используйте union all и distinct для этих конкретных столбцов по имени. ОБЪЕДИНЕНИЕ ВСЕХ сохраняет повторяющиеся строки в результирующем наборе.
Ответ №1:
Похоже, вы хотите что-то вроде следующего
SELECT *
FROM note_data
UNION ALL
SELECT *
FROM note_data_historical
WHERE note_data_historical.appointment_id NOT IN
(
SELECT appointment_id FROM note_data
)
При этом будут получены все ваши строки note_data и note_data_historical, если только note_data_historical.appointment_id не существует в note_data. И вам не нужно перечислять столбцы в вашем запросе.
Обратите внимание, что я использовал a UNION ALL
вместо a UNION
, но поскольку я не знаю ваших данных, я не знаю, действительно ли это разумно.
Комментарии:
1. @Belayer Это не зависит от
UNION
/UNION ALL
для удаления дубликатов,WHERE
для этого используется предложение. Исходя из моего понимания вопроса, OP рассматривает дублирует случай, когда appointment_id существует в обеих таблицах. (Конечно, возможно, я неправильно понимаю вопрос.)2. Извините @EdmCoff, комментарий предназначался для OP, думаю, я его перенесу. Но это пересекающаяся концепция получения истории строки, в которой изменился идентификатор.