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.
- Будьте осторожны со временем. Вы уверены, что они точно такие же, вплоть до миллисекунды?