2012-01-18 15 views
0

返される整数値であり、wrap文の中にいくつかのwrap文があります。値は計算されています...私が取得している別のwrap文から複数の整数値を選択したいときです問題は...複製はそれぞれのvalによって異なります。たまには、私はそれがすべきであるよりも正確に200倍大きい値を得ています。ここでSQLのデータ複製 -

SELECT 
     SUM(c.val) 
     ,SUM(t.val) 
     ,SUM(x.val) 
     ,SUM(z.val) 
    FROM  
    (SELECT CASE 
     WHEN ------CRITERIA FOR CODE HERE 
    FROM tableName 
    WHERE ... 
    )c, 

    (SELECT CASE 
    WHEN ------CRITERIA FOR CODE HERE 
    FROM tableName 
    WHERE ... 
    )t, 

    (SELECT CASE 
    WHEN ------CRITERIA FOR CODE HERE 
    FROM tableName 
    WHERE ... 
    )x, 

    (SELECT CASE 
    WHEN ------CRITERIA FOR CODE HERE 
    FROM tableName 
    WHERE ... 
    )z 
+0

結合基準のない結合のように見えます。デカルト参加するつもりですか? –

+0

この質問は非常に広いです。使用しているデータ構造や期待される結果など、より具体的な例を提供できますか?さらに、 "ラップ"ステートメントと呼ばれるものは、より適切には "インラインビュー"または "サブクエリ"と呼ばれます。 –

答えて

0

は、あなたがそのようなwhere句であなたのサブ選択を行うと、それは本質的にそれらを相互結合し、それはあなたが望むものではありません、コードの構造がどのように見えるかです。 あなたの各サブ選択の一部が同じで、次のように、クエリのSELECT部分​​でそれらを行う「... tableNameのFROM」場合:

SELECT 
    (CASE WHEN --criteria...) as c, 
    (CASE WHEN --criteria...) as t, 
    (CASE WHEN --criteria...) as x, 
    (CASE WHEN --criteria...) as z 
FROM tableName 
WHERE ... 
+0

ありがとう、これは私が元々考えていたもので、特定のラップステートメントの値を他のラップステートメントのサムに集計したいのです...ありがとう! – user1157084

+0

それぞれのc、t、x、zを独立に次のように合計することができます: 'SUM(CASE WHEN ...)as c' – Chad

0

クロス結合はあなたのためのつもり重複レコードで、あなたのSUMはそれ以上のものを集めるでしょう。だからあなたが期待していたよりも大きな値を得ているのです。

完全な質問を投稿した場合は、書き換えをお手伝いできます。

0

あなたのデータベースはサブクエリのすべての結果をクロス結合していると思います。 SQLiteの例を見てみましょう:

sqlite> create table A(a,b); 
sqlite> create table B(c,d); 
sqlite> insert into B values ('1c','1d'); 
sqlite> insert into B values ('2c','2d'); 
sqlite> insert into A values ('1a','1b'); 
sqlite> insert into A values ('2a','2b'); 
sqlite> select a,b,c,d from A, B; 
1a|1b|1c|1d 
1a|1b|2c|2d 
2a|2b|1c|1d 
2a|2b|2c|2d 
sqlite> select a,b from A; 
1a|1b 
2a|2b 
sqlite> select c,d from B; 
1c|1d 
2c|2d 

ご覧のとおり、テーブルAとテーブルBは両方とも2行です。ただし、Aから*を選択すると、Bは4行を生成します。これは、AとBからの行に対して可能なすべての組み合わせを作成するためです。したがって、sum()列を使用すると、大きな結果が得られます。

あなたのような何かをしようとすることができます:

SELECT 
    max(first_big_one_column_select), 
    max(second_big_one_column_select), 
    ... 

しかし、私はそれがうまくいくかはわかりません。私はあなたが使用しているデータベースに大きく依存すると思います。