SQL在两个表中的匹配行上选择一行
我有两个具有相同字段的表,但最终值的计算略有不同。我需要将这两个表中的数据合并到一个表中,但需要在有匹配项时将一个记录优先于另一个记录。你知道这怎么可能吗 以下是两条匹配记录的模型:SQL在两个表中的匹配行上选择一行,sql,Sql,我有两个具有相同字段的表,但最终值的计算略有不同。我需要将这两个表中的数据合并到一个表中,但需要在有匹配项时将一个记录优先于另一个记录。你知道这怎么可能吗 以下是两条匹配记录的模型: ID Balance Type CCY Payment Final_Balance 28 1068376.037 F - CC GBP 78124 990252.0367 28 1068376.037 F - DD GBP 982905
ID Balance Type CCY Payment Final_Balance
28 1068376.037 F - CC GBP 78124 990252.0367
28 1068376.037 F - DD GBP 982905 85470.08293
抱歉,如果格式不好,我不确定如何格式化表数据
这两个表中有数千条记录,但对于少数记录,两个表中的信息相同。基本上,我要做的是找到匹配的地方,我希望它选择F-CC而不是F-DD,这样我的最终表中就有了唯一的记录
谢谢我个人使用
行编号()
来处理类似的问题,但可能有更好的解决方案
您可以重新运行此SQL以显示最终答案是如何缓慢生成的:
declare @t1 table (id int)
declare @t2 table (id int, txt varchar(2))
insert into @t1
select 1 union
select 2
insert into @t2
select 1, 'FC' union
select 1, 'FD' union
select 2, 'FC' union
select 2, 'FD'
select *, row_number() over (partition by id order by txt) as we_want_the_ones
from @t2
select * from (
select id, txt, row_number() over (partition by id order by txt) as we_want_the_ones
from @t2
) z
where we_want_the_ones = 1
select *
from @t1 a
join (
select * from (
select id, txt, row_number() over (partition by id order by txt) as we_want_the_ones
from @t2
) z
where we_want_the_ones = 1
) b on a.id = b.id
我对这个问题的理解是,您有两个表(
A
和B
),它们的列完全相同。您希望将这些表合并到一个数据集中,但有时两个表中的行彼此“匹配”。在这种情况下,您仅根据某个优先级获取其中一行
从你的例子看来
- 匹配:当
相同时发生ID
- 优先级:基于
列,按较低的字母顺序排列优先级类型
并集
。获取所有记录,不必担心是否匹配,将它们放在临时表中供以后使用
SELECT ID, Balance, Type, CCY, Payment, Final_Balance
INTO #AllRecords
FROM A
UNION
SELECT ID, Balance, Type, CCY, Payment, Final_Balance
FROM B
接下来,我将按
确定匹配项的字段分组,然后使用MIN
或MAX
获得优先级列的正确值。根据我对你问题的理解,这意味着
SELECT ID, MIN(Type) AS Type
FROM #AllRecords
GROUP BY ID
通过该查询,您现在拥有了要在最终结果中显示的所有记录的自然键。剩下要做的就是使用这些键查找其余的列,我们可以将该查询用作子查询
SELECT ID, Balance, Type, CCY, Payment, Final_Balance
FROM #AllRecords r
INNER JOIN (
SELECT ID, MIN(Type) AS Type
FROM #AllRecords
GROUP BY ID ) final ON r.ID = final.ID AND r.Type = final.Type
因此,最终的查询是
SELECT ID, Balance, Type, CCY, Payment, Final_Balance
INTO #AllRecords
FROM A
UNION
SELECT ID, Balance, Type, CCY, Payment, Final_Balance
FROM B
SELECT ID, Balance, Type, CCY, Payment, Final_Balance
FROM #AllRecords r
INNER JOIN (
SELECT ID, MIN(Type) AS Type
FROM #AllRecords
GROUP BY ID ) final ON r.ID = final.ID AND r.Type = final.Type
请不要使用不适用于您的问题的标记。我删除了数据库标签,因为不清楚您实际使用的是哪一个。请只添加您实际使用的数据库的标签。我只在问题底部使用了推荐的标签。您最好与Stackoverflow联系,并要求他们修改,如果这是您花费时间做的事情,请不要与每个人联系。@Carlos80:否。Stackoverflow建议使用可能匹配的标记。它无法知道您使用的是什么DBMS。它只能提出最有可能的建议。那么:是哪一个?MySQL?PostgreSQL?SQL Server?神谕为了给出一个合适的答案,了解DBMS是很重要的。再次感谢你的建议,如上所述,我不知道,只使用了文章底部的标签。我说过,我从来没有点击过PostgreSQL或Oracle,所以我不确定这是否是一个选项。同时,我也不确定这是否是为了得到对您问题的适当关注。这里的人们选择了他们更愿意回答问题的技术。那么,再说一遍,您在哪个数据库中?你还是没回答。这一点很重要,因为答案可能会随着数据库的变化而变化。感谢您的帮助,我已经成功地在匹配/重复记录的情况下使其完美工作。但是,查询现在排除了只有F-CC或F-DD的唯一记录的任何记录,因此我的数据集中目前缺少大约10000条记录。抱歉,如果我没有在OP中详细说明这一点。我相信查询不会排除唯一记录。只要它们的ID与任何其他记录不同。。你能确认两个表中没有其他记录具有相同的ID吗?啊,我发现了。它来自我的工会查询。我似乎在提取重复的记录,一个是F-CC,另一个是空白的。当我做MIN时,它给我空白记录而不是F CC或F DD,这是唯一的。你想出了一个解决方案吗?您可以在第一个查询中添加
WHERE
子句,以筛选出类型不是F-CC或F-DD的记录。或者更改优先级的工作方式以处理空白记录。您好,谢谢您的帮助。最后,我在嵌套的select查询中创建了一个标志,它遍历所有记录,并允许我使用MIN命令进行筛选。