2

データは複数のソースから発信されているため、重複するエントリを含む行のセットがあります。これらのデータソースの優先度を示す別の参照テーブルもあります。

このリストを重複排除するための最も効果的な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には、2つのソースの列が同じですが、データが異なる可能性があるため、価格が異なる可能性があります。課題は、最も優先度の高いソースからの行から価格(およびその他すべての情報)を取得する必要があることです。厄介なことに、私はすべてのソースからのすべてのアイテムのデータを持っているわけではありません。

したがって、アイテム1にはソースAとBからのデータが含まれている可能性がありますが、アイテム2にはソースBとCからのデータしか含まれていない可能性があります。したがって、削除は一意のアイテムごとに行う必要があります。

4

2 に答える 2

1

私はあなたがこのようなことをすることができると思います:

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にサブクエリのスコープが含まれるかどうかは思い出せません。

于 2009-07-31T03:06:07.273 に答える
0

ROW_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;

ロブ

于 2009-07-31T03:13:36.387 に答える