Сложный SQL-запрос - PullRequest
       1

Сложный SQL-запрос

2 голосов
/ 14 августа 2011

Моя база данных выглядит так:

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

Я хочузапросить базу данных для следующего:

  • Клиенты с максимальным количеством продуктов: если есть 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.Теперь я думаю, что этот запрос не эффективен.Можете ли вы предложить более эффективный вариант?Я не использовал никаких индексов.

1 Ответ

2 голосов
/ 14 августа 2011

Вам необходимо добавить спецификатор производной таблицы для последнего выбора:

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    -- <-----------------
                 )

[Я не могу комментировать относительно правильности или эффективности вашего запроса, без схемы таблицы, индексов и примеров данных]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...