SQL, объедините две таблицы только с разными значениями (на основе только трех полей, а не всей строки)

Я пытаюсь объединить три таблицы: приложение, аудио, видео. Все они имеют одинаковую схему, но в аудио и видео есть "дубликаты". Где запись в видео всегда будет отображаться в аудио. Я помещаю дубликаты в кавычки, так как вся строка не дублируется, а основана на трех полях.

Аудио стол

   **Calls   | StartTime    | EndTime       | Quality | CallType**
      John   | 3/15/16 8:01 | 3/15/16 9:01  |   0     |   Audio
      Mary   | 3/15/16 9:35 | 3/15/16 10:34 |   1     |   Audio

Видео стол

   **Calls   | StartTime     | EndTime       | Quality | CallType**
      John   | 3/15/16 8:01  | 3/15/16 9:01  |   1     |   Video
      Sue    | 3/15/16 11:32 | 3/15/16 11:50 |   0     |   Video

Таблица применения

   **Calls   | StartTime     | EndTime       | Quality | CallType**
      Matt   | 3/15/16 7:31  | 3/15/16 8:01  |   1     |   App
      Bill   | 3/15/16 1:32  | 3/15/16 2:50  |   0     |   App

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

   **Calls   | StartTime     | EndTime       | Quality | CallType**
      Mary   | 3/15/16 9:35  | 3/15/16 10:34 |   1     |   Audio
      John   | 3/15/16 8:01  | 3/15/16 8:01  |   1     |   Video
      Sue    | 3/15/16 11:32 | 3/15/16 11:50 |   0     |   Video
      Matt   | 3/15/16 7:31  | 3/15/16 8:01  |   1     |   App
      Bill   | 3/15/16 1:32  | 3/15/16 2:50  |   0     |   App

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

   SELECT Calls, StartTime, EndTime, Quality, CallType
   FROM Audio

   EXCEPT
   SELECT Calls, StartTime, EndTime, Quality, CallType
   FROM Video

   UNION
   SELECT Calls, StartTime, EndTime, Quality, CallType
   FROM Video

   UNION
   SELECT Calls, StartTime, EndTime, Quality, CallType
   FROM Application

1 ответ

Решение

Хм, я бы сделал это так:

SELECT Calls, StartTime, EndTime, Quality, CallType
FROM Application
UNION ALL
SELECT Calls, StartTime, EndTime, Quality, CallType
FROM Video
UNION ALL
SELECT Calls, StartTime, EndTime, Quality, CallType
FROM Audio a
WHERE NOT EXISTS (SELECT 1
                  FROM Video v
                  WHERE v.Calls = a.Calls and v.StartTime = a.StartTime and v.EndTime = a.EndTime
                 );

Заметки:

  • использование UNION ALL вместо UNION если вы намеренно не хотите нести дубликаты.
  • Это должно работать в любой базе данных; он использует стандартный SQL.
  • Будьте осторожны со временем. Вы уверены, что они точно такие же, вплоть до миллисекунды?
Другие вопросы по тегам