0

バイナリに変換すると興味の順列を表す整数を含む列を持つテーブルがあります。例えば:

John, Smith, 6
David, Jones, 512
Mark, Clark, 2

Interestsテーブルが次のようになっているとします。

1, TV
2, Music
4, Current Affairs
...
512, Sport

私の出力は次のようになります。

John, Smith, Music
John, Smith, Current Affairs
David, Jones, Sport
Mark, Clark, Music

現在、テーブルには 15 の興味があり、2^15 の可能な順列が残っています (私はそう思います)。

現時点で考えられる唯一のことは、何らかのループ/カーソルを使用して、すべての順列でマッピング テーブルを作成し、それを結合できるようにすることです。

別の方法はありますか?(それぞれの興味をテーブルに入れ、結合基準で関数を使用して、その興味にビットが設定されているかどうかを確認できるのでしょうか?)

または、マッピング テーブルを作成するための SQL を手伝ってもらえますか?

4

3 に答える 3

2

これを試して:

SELECT S.Name, S.Surname, I.Name
FROM SomeTable S
JOIN Interests I
  ON I.ID & S.InterestCombinedID > 0

&ビットごとの AND 演算子です。

例として、

2 & 6 = 10b  & 110b = 10b  = 2 > 0  and
4 & 6 = 100b & 110b = 100b = 4 > 0

したがって、(6) は(2) および(4)とJohn Smith一致します。MusicCurrent Affairs

残念ながら、これはインデックスを許可しません (私の知る限り)。インデックスを許可するには、設定されているビットごとにテーブルの結合に頼る必要がある場合がありますInterest(ループまたは CTE を使用) (またはテーブル構造を変更します)。明らかにこれはもっと複雑で、現在 15 の関心事しかないので、複雑さの違いはほとんど目立たないはずです。

于 2013-07-03T12:39:15.550 に答える
0

両方のテーブル間でクロス結合を使用し、必要な列のみを選択します。

Select * from TableA A Cross JOIN TableB B 
于 2013-07-03T12:37:56.983 に答える