2

テーブルから最も近い一致を返すクエリを作成しようとしています。テーブルは階層を表し、次のようになります。

Hier_Code Group1 Group2 Group3
_________ ______ ______ ______
A         1      1      5 
AA        1      2      5
AAA       1      2      5
AAB       1      3      5
AB        2      3      5
ABA       2      3      5
ABB       2      3      5

私が探している値は完全に一致しない可能性があります。その場合、次のレベルに「ロールアップ」して一致を見つけたいと思います。例えば:

Value     Returns:  
A         1      1      5 (Perfect match)
AAC       1      2      5 (AA is closest)
AABB      1      3      5 (AAB is closest)

アイデアは、一致するものが見つかるまで、検索語から一度に 1 文字ずつ削除するというものです。私はこれを再帰的な CTE と WHILE ループで試してみましたが、役に立ちませんでした。

助言がありますか?

前もって感謝します

4

2 に答える 2

2

これを試して:

SELECT top 1 Group1, Group2, Group3 
FROM temp 
WHERE 'AABB' like Hier_Code + '%'
GROUP BY Group1, Group2, Group3
ORDER BY MAX(len(Hier_Code)) desc
于 2012-06-14T18:17:39.727 に答える
0

以下は、動的 SQL を作成するために使用できるスターターです。

           select id from t
           where g1 = 1 and g2 = 1 and g3 = 5

           union

           select id from t
           where g1 = 1 and g2 = 1 

           union

           select id from t
           where g1 = 1 

UNION のデフォルトの動作は、重複を排除することです。そのため、これら 3 つの選択が実行された後、結果セットに id が複数回出現することはありません。

問題は、いくつかの順列があることです。

         {g1, g2, g3}, {g1, g3},  {g1, g2}, {g2, g3}

したがって、私の例で行ったように、単純に最終条件を取り除くことはできません。

于 2012-06-14T18:12:53.813 に答える