sql - 合并 SQL 中的两个表,仅基于列的唯一行
问题描述
我有两个表 LeftCamera 和 RightCamera 具有相同的架构。列标题是 FrameNumber、X、Y 和 TestId。我希望能够将这两个表与一些规定结合起来。1.我想合并FrameNumber唯一的两个表。2. 为每个唯一的 FrameNumber 包括 X、Y 和 TestId。3. 当出现重复的 FrameNumber 时,选择 LeftCamera 而不是 RightCamera。并且 4. 仅将 LeftCamera 的 TestId 等于 RightCamera 的 TestId 的行组合在一起。
此查询返回所有唯一的 FrameNumber 值,这是我想要的,但它不包括表的其余部分,也不特定于 TestNumber。
Select FrameNumber From LeftCamera
UNION
Select FrameNumber From RightCamera
Order By FrameNumber
这更接近但它仍然给我重复的 FrameNumber 并且不考虑 TestId
Select FrameNumber, X, Y, TestId
FROM LeftCamera
UNION
Select FrameNumber, X, Y, TestId
FROM RightCamera AS RC
Where Not Exists (Select 1 From LeftCamera AS LC
Where RC.FrameNumber = LC.FrameNumber)
Order By FrameNumber
这是我想要的结果 在此处输入图像描述。我有点卡住了,可以使用一些帮助。我正在使用 SQL 服务器。提前致谢。
解决方案
如果你想用 解决这个问题UNION
,你已经很接近了。您的问题是,在NOT EXISTS
您正在查看的子句中FrameNumber
唯一的,而您真正感兴趣的FrameNumber
是与TestId
.
这同样适用于ORDER BY
:不要FrameNumber
单独看,而是按顺序TestId
排列FrameNumber
。
最后,您应该使用它,UNION ALL
因为它NOT EXISTS
已经阻止了重复。
Select FrameNumber, X, Y, TestId
FROM LeftCamera
UNION ALL
Select FrameNumber, X, Y, TestId
FROM RightCamera AS RC
Where Not Exists (Select 1 From LeftCamera AS LC
Where RC.TestId = LC.TestId
And RC.FrameNumber = LC.FrameNumber)
Order By TestId, FrameNumber;
我添加了这个答案是为了建立您的查询并指出您的错误。但是,您会看到,这比简单的完全外连接更易读。但是,如果您的 DBMS 恰好缺少完全连接,这是一个可行的解决方案。
推荐阅读
- google-cloud-platform - GCP Terraform 以公共地址为条件
- swift - 如何检查在我的单元测试中是否释放了无主引用?
- r - 如何在 R Shiny 应用程序中显示特定 R 文件的代码?
- javascript - 我如何在 JS 中设置 coockies,使输入字段中的值过期?
- swift - 在 iOS 13 中将 UIImagePickerController 导航栏设置为不透明
- java - JavaFX:支持不同的分辨率
- android - RecyclerView adapterNotifychanged 不起作用
- python - 如何将字符串末尾的可选组与正则表达式匹配?
- facebook - okta OAuthError:无法从授权码获取访问令牌
- c# - CSVHelper - 使用两个映射类并根据 csv 文件每一行的字段中的值选择映射