を異なった行、私はこの(簡潔にするため省略無関係なフィールド)のような構造のデータベーステーブルを持っている検索:すべてのフィールドは整数ですSQL:フィールド値は
rankings
------------------
(PK) indicator_id
(PK) alternative_id
(PK) analysis_id
rank
を。最初の3つ(「(PK)」と表示されています)は複合主キーです。与えられた「分析」には複数の「選択肢」があり、それぞれには多くの「インジケータ」ごとに「ランク」があります。
代替/インジケータの組み合わせのランクが異なる任意の数の分析を効率的に比較する方法を探しています。我々は、このデータ持っているのであれば、例えば、:
analysis_id | alternative_id | indicator_id | rank
----------------------------------------------------
1 | 1 | 1 | 4
1 | 1 | 2 | 6
1 | 2 | 1 | 3
1 | 2 | 2 | 9
2 | 1 | 1 | 4
2 | 1 | 2 | 7
2 | 2 | 1 | 4
2 | 2 | 2 | 9
を...そして、理想的な方法は、以下の違いを識別します:
analysis_id | alternative_id | indicator_id | rank
----------------------------------------------------
1 | 1 | 2 | 6
2 | 1 | 2 | 7
1 | 2 | 1 | 3
2 | 2 | 1 | 4
私は私が何をしたいんクエリを思い付い2つの解析IDの間に違いがあることがわかりました(つまり、ユーザーが2、5、9などを比較したい場合や、少なくとも1つの解析他のものとは異なる)。私のクエリは次のとおりです。
declare @analysisId1 int, @analysisId2 int;
select @analysisId1 = 1, @analysisId2 = 2;
select
r1.indicator_id,
r1.alternative_id,
r1.[rank] as Analysis1Rank,
r2.[rank] as Analysis2Rank
from rankings r1
inner join rankings r2
on r1.indicator_id = r2.indicator_id
and r1.alternative_id = r2.alternative_id
and r2.analysis_id = @analysisId2
where
r1.analysis_id = @analysisId1
and r1.[rank] != r2.[rank]
(これは、追加のフィールドの代わりに、列に分析値を置く、私はどちらかの方法が働くだろうと思います。。)
どのように私は多くの分析IDを処理するために、このクエリを一般化することができますか? (あるいは、別のより良いクエリを出して仕事をしていますか?)重要な場合に備えて、SQL Server 2005を使用しています。
必要に応じて、私はいつもテーブルからすべてのデータを取り出してコードの違いを探すことができますが、しばしば何千もの行が気になることが多いのでSQLソリューションが望ましいでしょう。私がそれを避けることができれば、それらをすべて転送する。 (ただし、SQLでこれを行わないような魅力的な理由がある場合は、これも良い答えと考えています)
パーフェクト - 一時テーブルなしでそれをするためのボーナスポイント!ありがとう! –