SQL,仅合并两个具有不同值的表(仅基于三个字段,而不是整行)
SQL, combine two tables with distinct values only (based on only three fields, not entire row)
我正在尝试组合三个 table,应用程序、音频、视频。它们都具有相同的架构,但音频和视频中有 'duplicates'。视频中的条目也将始终显示在音频中。我将重复项放在引号中,因为整行都没有重复,但它们是基于三个字段。
音频Table
**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
视频Table
**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
申请Table
**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
我想将它们合并为一个 table,这样可以在存在重复时保留来自视频的数据 - 所以您看到 John 只出现一次,其质量和呼叫类型来自视频 table :
**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
嗯,我会这样做:
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.
- 注意与时俱进。您确定它们完全相同,精确到毫秒吗?
我正在尝试组合三个 table,应用程序、音频、视频。它们都具有相同的架构,但音频和视频中有 'duplicates'。视频中的条目也将始终显示在音频中。我将重复项放在引号中,因为整行都没有重复,但它们是基于三个字段。
音频Table
**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
视频Table
**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
申请Table
**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
我想将它们合并为一个 table,这样可以在存在重复时保留来自视频的数据 - 所以您看到 John 只出现一次,其质量和呼叫类型来自视频 table :
**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
嗯,我会这样做:
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.
- 注意与时俱进。您确定它们完全相同,精确到毫秒吗?