代码之家  ›  专栏  ›  技术社区  ›  jkelley

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

  •  2
  • jkelley  · 技术社区  · 15 年前

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

    是否有人对最有效的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
    

    表A中两个数据源的列相同,但数据可能不同,因此它们的价格可能不同。挑战在于,我必须从具有最高优先级的源代码中获取价格(以及所有其他信息)。为了使事情复杂化,我没有来自所有来源的每个项目的数据。

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

    2 回复  |  直到 10 年前
        1
  •  1
  •   Jon    15 年前

    我想你可以这样做:

    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是否会在子查询的作用域内。

        2
  •  0
  •   Rob Farley    15 年前

    试着用行号找到你想要保留的行,然后去掉其余的行。

    …记住用分号结束前面的语句…

    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;
    

    抢劫