Как получить все столбцы в SQL после использования функций DISTINCT и UNION?

#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. Отфильтровывать перекрывающиеся строки
  3. Отобразите все столбцы (например, ВЫБЕРИТЕ *, сгруппированные по или объединенные в один столбец)

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

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, думаю, я его перенесу. Но это пересекающаяся концепция получения истории строки, в которой изменился идентификатор.