SQL Embedded Select с SUM, слегка ограничен - PullRequest
0 голосов
/ 27 июня 2011

У меня есть немного странный запрос, против которого я бился головой, интересно, есть ли у кого-нибудь идеи. Что делает его немного более сложным, так это то, что он должен работать в ограниченной среде во встроенном продукте, где я могу изменять запрос только после объединения.

У меня есть соединение между 2 таблицами для создания полной строки, каждая строка имеет идентификатор модуля и рабочий столбец, который равен 0 для неработающего и 1 для обработанного. Каждая строка также имеет столбец квоты, который ссылается на идентификатор модуля, и все строки с одинаковым идентификатором модуля имеют одинаковое значение квоты.

Так, например, данные

ID |Module | Quota | Complete
-------------------------
1  |A      | 1     | 0
2  |B      | 2     | 1
3  |A      | 1     | 0
4  |A      | 1     | 0
5  |B      | 2     | 1
6  |C      | 4     | 0

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

Где я должен это:

Select table_a.quota, table_a.module, table_b.complete
from table_a inner join table_b on table_a.id = table_b.id
having table_a.quota > (select sum(table_b.complete) from table_a inner join table_b on table_a.id = table_b.id where table_a.module = *module*)

Поскольку я могу повлиять только на что-либо после предложения has, я не знаю, как ссылаться на значение модуля из строки исходного запроса во встроенном выражении ( module ), есть идеи?

Заранее спасибо всем, кто может помочь!

1 Ответ

0 голосов
/ 27 июня 2011

Первое замечание: вы хотите использовать WHERE вместо HAVING, насколько я могу судить; у вас нет GROUP BY.

  • ГДЕ применяется после того, как все объединения завершены, но до завершения агрегирования.
  • Применяется после любой агрегации.

С точки зрения ссылки на внешний запрос, внутри коррелированного подзапроса необходимо использовать псевдонимы ...

SELECT
  table_a.quota,
  table_a.module,
  table_b.complete
FROM
  table_a
INNER JOIN
  table_b
    ON table_a.id = table_b.id
WHERE
  table_a.quota
  >
  (
    SELECT
      SUM(lookup_b.complete)
    FROM
      table_a AS lookup_a
    INNER JOIN
      table_b AS lookup_b
        ON lookup_a.id = lookup_b.id
    WHERE
      lookup_a.module = table_a.module
  )
...