首页 > 解决方案 > 合并 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 服务器。提前致谢。

标签: sqlsql-server

解决方案


如果你想用 解决这个问题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 恰好缺少完全连接,这是一个可行的解决方案。


推荐阅读