2011-08-14 24 views
2

私のデータベースには、次のようになります。複雑なSQLクエリ

  • お客様

    • Customer (c_id, c_name)
    • Products (p_id, p_name, p_cost)
    • Buys (p_id references Products, c_id references Customer)

    は、私は次のデータベースを照会したいですw i最大製品数:同じ製品数の顧客が2人以上いる場合は、すべての製品の合計価格が考慮されます。

私は試してみましたが、「間違った構文近くに)」。

私はそれを何の利益も得ないようにデバッグしようとしています。

も、このクエリやデバッグ、誰もがより最適なクエリを提案することはできますか?

select a1.c_id, a1.c_name 
from 
    (select c.c_id, c.c_name 
    from Customer c 
    where c.c_id in 
     (select b.c_id 
      from Buys b 
      group by b.c_id 
      having COUNT(b.p_id) >= all 
      (
       select COUNT(b.p_id) 
       from Buys b 
       group by b.c_id 
     ) 
    ) 
) 
as a1 
join 
    (select b.c_id, SUM(p.p_cost) as 'SumCost' 
    from Buys b 
    join Products p on b.p_id = p.p_id 
    group by b.c_id 
    ) as a2 on a1.c_id = a2.c_id 
where 
    a2.SumCost = (select MAX(SumCost) 
        from 
         (select b.c_id, SUM(p.p_cost) as 'SumCost' 
         from Buys b 
         join Products p on b.p_id = p.p_id 
         group by b.c_id 
        ) 
       ) 

更新:

上記のクエリはmohdowaisにより、正常にデバッグされます。 このクエリは効率的ではないと私は考えています。もっと効率的なものをお勧めしますか? 私はインデックスを使用していません。

答えて

2

あなたは最後の選択のための派生テーブル指定子を追加する必要があります。

select a1.c_id,a1.c_name 
    from 
    (
    select c.c_id,c.c_name 
    from Customer c 
    where c.c_id in 
    (
     select b.c_id 
     from Buys b 
     group by b.c_id 
     having COUNT(b.p_id)>=all 
     (
      select COUNT(b.p_id) 
      from Buys b 
      group by b.c_id 
     ) 
    ) 
) 
as a1 join (
        select b.c_id,SUM(p.p_cost) as 'SumCost' 
        from Buys b join Products p on (b.p_id=p.p_id) 
        group by b.c_id 
       ) 
       as a2 on (a1.c_id=a2.c_id) 

       where a2.SumCost= 
       (
        select MAX(SumCost) 
        from 
        (
         select b.c_id,SUM(p.p_cost) as 'SumCost' 
         from Buys b join Products p on (b.p_id=p.p_id) 
         group by b.c_id 
        ) maxTmp -- <----------------- 
       ) 

[私はテーブルスキーマ、インデックス、および例なしに、しかし、あなたのクエリの正確性や効率としてコメントすることはできませんデータ]

+0

@ミッチ小麦:ありがとう。出来た。しかし、私はそれについてもっと知る必要があります。あなたはその "maxTmp"を少し詳しく説明できますか?あなたが選択した結果に別名を与えなければならない選択の結果から選択するとき – Kameron

+0

: '(何とかから選択*)SELECT * FROMはミッチ小麦@ – Bohemian

+0

をsomeAlias':marc_s @ – Kameron