Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL在两个表中的匹配行上选择一行_Sql - Fatal编程技术网

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
    相同时发生
  • 优先级:基于
    类型
    列,按较低的字母顺序排列优先级
我还假设SQL Server,因为这是我喜欢的,而你没有说

希望所有这些都是正确的。。现在,我将如何处理它

我将首先执行两个表的
并集
。获取所有记录,不必担心是否匹配,将它们放在临时表中供以后使用

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命令进行筛选。