SQLServer2012+C#にてデータベースアプリを構築しております。
AテーブルとBテーブルがあり、内容はそれぞれ以下です。
■Aテーブル
ID 食材1 食材2 食材3 食材4
1 人参 じゃがいも 肉
■Bテーブル
ID 食材1 食材2 食材3 食材4
1 なす 人参 人参 肉
この2つのテーブルを「ID」で紐づけて、食材の一致数を抽出したく思っております。
調べた結果、以下のようなやり方を見つけました。
方法1
※該当文字列を削除し、その削除桁数からいくつ含まれていたかを割り出す方法のようです。
select ID, ( select (len(A.食材1+A.食材2+A.食材3+A.食材4)-len(replace(A.食材1+A.食材2+A.食材3+A.食材4, B.食材1, ''))) / len(B.食材1) ) as CNT1 from A INNER JOIN B ON A.ID = B.ID
方法2
※単純に全パターン比較
select ID, ( CASE WHEN A.食材1 = B.食材1 THEN 1 ELSE 0 END AS A1_B1 + CASE WHEN A.食材1 = B.食材2 THEN 1 ELSE 0 END AS A1_B2 + CASE WHEN A.食材1 = B.食材3 THEN 1 ELSE 0 END AS A1_B3 + CASE WHEN A.食材1 = B.食材4 THEN 1 ELSE 0 END AS A1_B4 + CASE WHEN A.食材2 = B.食材1 THEN 1 ELSE 0 END AS A2_B1 + CASE WHEN A.食材2 = B.食材2 THEN 1 ELSE 0 END AS A2_B2 + CASE WHEN A.食材2 = B.食材3 THEN 1 ELSE 0 END AS A2_B3 + CASE WHEN A.食材2 = B.食材4 THEN 1 ELSE 0 END AS A2_B4 + CASE WHEN A.食材3 = B.食材1 THEN 1 ELSE 0 END AS A3_B1 + CASE WHEN A.食材3 = B.食材2 THEN 1 ELSE 0 END AS A3_B2 + CASE WHEN A.食材3 = B.食材3 THEN 1 ELSE 0 END AS A3_B3 + CASE WHEN A.食材3 = B.食材4 THEN 1 ELSE 0 END AS A3_B4 + CASE WHEN A.食材4 = B.食材1 THEN 1 ELSE 0 END AS A4_B1 + CASE WHEN A.食材4 = B.食材2 THEN 1 ELSE 0 END AS A4_B2 + CASE WHEN A.食材4 = B.食材3 THEN 1 ELSE 0 END AS A4_B3 + CASE WHEN A.食材4 = B.食材4 THEN 1 ELSE 0 END AS A4_B4 ) AS CNT1 from A INNER JOIN B ON A.ID = B.ID
方法1はパフォーマンス的に遅い、という記事を見かけたのですが、
他に同じ結果を取得する方法(関数?)のようなものはあるのでしょうか?
ちなみにEXCELでは
COUNTIF関数でAテーブルの食材1~4の範囲を指定すると簡単にカウントできます。
値をBテーブルの食材1~4で4回行うと、AテーブルとBテーブルの食材一致数が算出できます。
それを同じことをやりたいのです。
分かるかたいらっしゃいましたら宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー