Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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_Tsql_Duplicate Data_Sql Delete - Fatal编程技术网

Sql 基于优先级列重复删除列表的提示

Sql 基于优先级列重复删除列表的提示,sql,tsql,duplicate-data,sql-delete,Sql,Tsql,Duplicate Data,Sql Delete,我有一组包含重复项的行,因为数据来自多个源。我还有一个单独的参考表,指示这些数据源的优先级 是否有人提供了最有效的t-SQL消除此列表中重复数据的好技巧 基本上,我有: SELECT a.*, b.priority FROM tableA as a JOIN tableB as b ON b.sourceId = a.sourceId 我一直把它放在一个临时表中,然后以一种奇怪的方式删除它,我认为这样会更有效 DELETE ta FROM #tmp ta JOIN #tmp tb ON ta

我有一组包含重复项的行,因为数据来自多个源。我还有一个单独的参考表,指示这些数据源的优先级

是否有人提供了最有效的t-SQL消除此列表中重复数据的好技巧

基本上,我有:

SELECT a.*, b.priority 
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId
我一直把它放在一个临时表中,然后以一种奇怪的方式删除它,我认为这样会更有效

DELETE ta
FROM #tmp ta
JOIN #tmp tb
ON ta.duplicateId = tb.duplicateId
WHERE ta.priority < tb.priority
删除ta
来自#tmp ta
加入#tmp tb
在ta.duplicateId=tb.duplicateId上
其中ta.priority
表A中两个来源的列相同,但数据可能不同,因此它们的价格可能不同。挑战在于,我必须从具有最高优先级的来源的行中获取价格(以及所有其他信息)。使事情复杂化的是,我没有所有来源的每一项数据


因此,项目1可能有来自源A和源B的数据,而项目2可能只有来自源B和源C的数据。因此,需要根据每个唯一的项目进行删除。

我认为您可以这样做:

SELECT a.*, b.priority 
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId and b.priority = (select max(priority) from tableB where b.sourceId = a.sourceId)

我不记得tSql是否在子查询的作用域内。

尝试使用ROW\u NUMBER查找您想要保留的,然后去掉其余的

…记住在前面的语句末尾加一个分号

with t as (
SELECT a.*, row_number() over (partition by a.sourceid order by b.priority desc) as priorityorder
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId
)
--select * from t
delete t 
where priorityorder > 1;

Rob

1)当您说您有重复的条目时,表A中两行重复的所有列是否都相同?如果它们不是,并且tableA.SourceId不同,并且tableB中只有一个匹配的源Id,并且您希望删除重复项,然后,只需在tableA上运行delete而不是temp表。它在这一点上确实有作用域-您能向我解释一下嵌套的select是如何连接的,以正确地获得正确的优先级吗?当然,这样,该查询将对tableA的每一行运行,因此,它在其上运行的行的sourceId的结果将是最高的。这就像在返回的每一行上运行一个函数。