SQL,仅结合两个具有不同值的表(仅基于三个字段,而不是整行)
Posted
技术标签:
【中文标题】SQL,仅结合两个具有不同值的表(仅基于三个字段,而不是整行)【英文标题】:SQL, combine two tables with distinct values only (based on only three fields, not entire row) 【发布时间】:2016-04-21 15:21:28 【问题描述】:我正在尝试组合三个表,即应用程序、音频、视频。它们都具有相同的架构,但音频和视频中存在“重复”。视频中的条目也将始终显示在音频中。我将重复项放在引号中,因为整行不是重复的,而是基于它们的三个字段。
音频表
**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。
与时俱进。您确定它们完全相同,精确到毫秒吗?
【讨论】:
看起来这行得通!谢谢你!您能解释一下 UNION 与 UNION ALL 的开销是什么意思吗? @MDo 。 . .UNION
删除重复值。这是一项昂贵的操作。 UNION ALL
不会删除重复项。以上是关于SQL,仅结合两个具有不同值的表(仅基于三个字段,而不是整行)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 LINQ sql 中将两个表与一个具有不同值的表连接起来?
如何在不修改数据库模式的情况下仅使用 PL/SQL 更新具有大值的 CLOB?