わかりましたので、カテゴリ リスト テーブルで使用される 4 つの使用可能な文字のうち 2 つだけを含むカテゴリ ID 列を含む製品テーブルにいくつかのデータがあります。
例: 製品のカテゴリ ID は「AA」ですが、デスクトップ (AAA) またはサーバー (AAB) カテゴリの製品である可能性があります。
カテゴリ テーブルには、役立つ情報を含む 3 つの列があります: include、atrID、および valID。valID 列には、コンマで区切られた値のリスト (「K01819」または「K00846,K00851」など) が含まれ、1 つ以上の ID のみを含む場合があります。atrID 列には、同様の文字列が含まれています (たとえば、'A00432')。include 列は、かなり前に行ったり来たりしたプログラマーによって行われた作業に基づいて、1 または 0 のいずれかです。
基本的に、彼はさまざまなテーブルを調べて、特定のカテゴリ (AA など) について、カテゴリ テーブルから別のテーブルを結合し、atrID と valID のリストを使用してすべてを結び付けることができることを発見しました。
例:
製品「a」の catID は AA で、デスクトップ マシンです。これは、include が 0、atrID が 'A00432'、valID が 'K01819' のカテゴリ 'AAA' に属します。
カテゴリ情報を取得するための SQL の例:
SELECT cat.atrID, cat.valID, cat.[include]
FROM db.dbo.cat AS cat
WHERE cat.catID = 'AAA'
次に、これらの変数を .Net コードに保存し、include の値に応じて SQL を構築します。また、valID を分割し、これを個々のパラメーターとして渡し、SQL サーバーで次のコードが実行されるようにします。
SELECT DISTINCT prod.prodID
FROM db.dbo.prod AS prod
INNER JOIN db.dbo.atr AS atr ON atr.prodID = prod.prodID
WHERE prod.catID = 'AA'
AND atr.atrID = 'A00432'
AND atr.valID NOT IN('K01819')
サーバーでこれを変更するNOT IN
にはIN
、サーバー (AAB) の include 値が 1 であるため、 を に変更します。例:
SELECT DISTINCT prod.prodID
FROM db.dbo.prod AS prod
INNER JOIN db.dbo.atr AS atr ON atr.prodID = prod.prodID
WHERE prod.catID = 'AA'
AND atr.atrID = 'A00432'
AND atr.valID IN('K01819')
一部のカテゴリでは、valID 列に複数の値が含まれているため、IN
andを使用します。NOT IN
私の質問は、事前に知らずに特定の製品のカテゴリを取得したい場合、それは可能ですか? (あると思われるカテゴリからすべての製品のリストを取得できず、いずれかのリストで一致する)。私は上司に何日もそれを理解できないと言っていて、どこにも行きません. どんな助けでも大歓迎です。
編集:
私がやろうとしているのは、任意の製品のカテゴリを取得することです。上記の SQL は、デスクトップ カテゴリとサーバー カテゴリの製品リストを取得する方法の例として含めました。
逆に、つまり、製品テーブルから 2 文字のカテゴリしかないときに、カテゴリ テーブルから 3 文字のカテゴリを取得したい。
編集2:
商品テーブルの列:
prodID varchar(40)
catID char(2)
サンプル行:
'S101010'、'AA' (デスクトップ)
'S202020'、'AA' (サーバー)
'S303030'、'ED' (レーザー プリンター)
'S404040'、'ED' (インクジェット プリンター)
カテゴリ テーブルの列:
catID varchar(4)
説明 varchar(50)
インクルード ビット (実際には、私が毎日何を扱っているかを示す tinyint =P)
atrID varchar(6)
valID varchar(250)
サンプル行:
「AAA」、「デスクトップ」、0、「A00432」、「K01819」、
「AAB」、「サーバー」、1、「A00432」、「K01819」、
「EDA」、「レーザープリンター」、1、「A00172」 ', 'K00846,K00851'
'EDB', 'インクジェットプリンター', 1, 'A00172', 'K00845'
属性テーブルの列:
prodID varchar(40)
catID char(2)
atrID varchar(10)
valID varchar(10)
サンプル行:
「S101010」、「AA」、「A00432」、「K01817」、「
S202020」、「AA」、「A00432」、「K01819」、「
S303030」、「ED」、「A00172」、「K00846」、「S303030
」 '、'ED'、'A00172'、'K00851'、'
S404040'、'ED'、'A00172'、'K00845'
上記に含めたのは、category.catID を知っている場合に製品のリストを取得する方法です。私が欲しいのは、product.prodID と product.catID しかないときにカテゴリを取得できるようにすることです。
私はこのようなものを求めていますが、不完全であり、そのままでは機能しません。次に、catIn.catID と catNotIn.catID の結果をチェックして、どちらが null ではないかを確認します。それが私のカテゴリになりますが、結合がわかりません。それさえ可能なら。また、3 つ以上のバリアントを持つカテゴリは考慮されません。
SELECT prod.prodID, catIn.catID, catNotIn.catID
FROM product AS prod
INNER JOIN attributes AS atr ON atr.prodID = prod.prodID
LEFT OUTER JOIN category AS catIn ON LEFT(catIn.catID, 2) = prod.catID AND catIn.atrID = atr.atrID --more conditions needed here
LEFT OUTER JOIN category AS catNotIn ON LEFT(catNotIn.catID, 2) = prod.catID AND catIn.atrID = atr.atrID --more conditions needed here
これが私が何を求めているのかをもう少しよく説明してくれることを願っています。