2011-07-31 4 views
0

私は3つのテーブルを持っていて、@ tableableのCountCol値を@tableBのCountCol値で割った値が、@ tableCのCountCol値のきれいな残りの部分を持っているかどうかを調べようとしています。私のテーブルのものから、私は100のKeyColで1つの行を示す結果セットを持っています。私はこの間違いを考えているかもしれません。セット内のSQL Server Set Based Division?

ありがとうございました。

Declare @tableA Table (KeyCol Int , CountCol Int) 
Declare @tableB Table (KeyCol Int , CountCol Int) 
Declare @tableC Table (KeyCol Int , CountCol Int) 
Insert Into @tableA Values (100 , 12) 
Insert Into @tableA Values (101 , 11) 
Insert Into @tableB Values (100 , 3) 
Insert Into @tableB Values (101 , 3) 
Insert Into @tableC Values (100 , 4) 
Insert Into @tableC Values (101 , 4) 
+2

おそらく1つのテーブルが3つあるのはなぜですか?解決すべき根本的な問題は何ですか?宿題? – gbn

答えて

1

これは大きなテーブルのために遅くなるだろうが、おそらく何より良い方法はありません。

SELECT 
    A.KeyCol AS A_KeyCol, 
    A.CountCol AS A_CountCol, 
    B.KeyCol AS B_KeyCol, 
    B.CountCol AS B_CountCol, 
    C.KeyCol AS C_KeyCol, 
    C.CountCol AS C_CountCol 
FROM B 
CROSS JOIN C 
INNER JOIN A ON A.CountCol = B.CountCol * C.CountCol 

に値がある場合には、BとCの値、およびチェックのすべての組み合わせを見てそれは彼らの製品です。

+0

2つのチェックマークを付けることができたらいいと思います。私はあなたの反応から価値があり、btillyもあります。 – Snowy

1

あなたは言っていませんが、KeyColも一致させたいと思っています。もしそうなら、次のように動作するはずです:

SELECT 
FROM A 
    JOIN B 
    ON a.KeyCol = b.KeyCol 
     /* Add mod check here? */ 
    JOIN C 
    ON a.KeyCol = c.KeyCol 
WHERE a.CountCol = b.CountCol + C.CountCol 

それはaの単一行のためにbcに多くの行を持つことが可能であるならば、それはで/* Add mod check here? */を置き換えるためにはるかに効率的かもしれ:

 AND a.KeyCol % b.KeyCol = 0 

ただし、結合がすべて1-1の場合、これは遅くなく高速になります。

+0

2つのチェックマークを付けることができたらいいですか?私はあなたの応答とMizardXの価値からも得ました。 – Snowy

関連する問題