Сравнение суммы с общим объемом памяти - PullRequest
1 голос
/ 05 января 2020

Я пытаюсь сравнить общее количество товаров, хранящихся на одном складе, с суммой товаров, имеющихся на этом складе. Пока у меня есть это (говорит мне, сколько из одного продукта хранится в одном из складов)

select warehousename, pname, sum(numitems)
from oswarehouse join osshelf on whid=warehouseid
join osstored_in using (sid,whid) 
join osproduct  using (pid)
group by warehousename, pname 

, и теперь я хотел бы сравнить это с этим оператором выбора (который просто говорит мне общую сумму продуктов, хранящихся на этом складе.

select sum(numitems) from oswarehouse 
join osshelf on whid=warehouseid 
join osstored_in using (sid,whid) group by warehousename

Возможно ли это, если да, то как? Я пробовал

having sum(numitems) > (select sum(numitems) from oswarehouse 
join osshelf on whid=warehouseid 
join osstored_in using (sid,whid) group by warehousenameect 

, но это просто приводит к бессмыслице, потому что оператор select выше возвращает несколько значений (?).

Ответы [ 2 ]

0 голосов
/ 05 января 2020

Вы действительно должны научиться квалифицировать ссылки на столбцы, чтобы было ясно, из какой таблицы они взяты. Это значительно упрощает для других людей (и, возможно, для вас в будущем) следование логике, которую вы написали c.

При этом единственное различие между двумя запросами - с точки зрения значений возвращается - это соединение с osproduct.

. Это join может изменить результаты только в том случае, если происходит одно из двух:

  • Строки отфильтровываются, потому что pid не совпадает.
  • Строки дублируются, поскольку pid дублируется в osproduct.

Второе условие, которое мы можем устранить, предполагая, что pid является первичным ключом в osproduct - и это выглядит как очень разумное предположение.

Первое можно исключить, предполагая, что столбец никогда не находится в NULL в ссылочной таблице и имеет правильное отношение внешнего ключа.

Следовательно, я не вижу особой ценности тому, что вы пытаетесь сделать. Модель данных solid обеспечивает согласованность значений, возвращаемых запросами.

0 голосов
/ 05 января 2020

Пойдет ли CTE на пользу? Как то так:

with 
tfirst as
  -- This is your first query
  (select warehousename, 
          pname, 
          sum(numitems) sumnum
   from oswarehouse join osshelf on whid=warehouseid
   join osstored_in using (sid,whid) 
   join osproduct  using (pid)
   group by warehousename, pname 
  ),
tsecond as
  -- This is your second query; I included WAREHOUSENAME so that I could
  -- join TSECOND to TFIRST
  (select warehousename, 
          sum(numitems) sumnum
   from oswarehouse 
   join osshelf on whid=warehouseid 
   join osstored_in using (sid,whid) 
   group by warehousename
  )
select a.warehousename,
       a.pname,
       a.sumnum
from tfirst a join tsecond b on a.warehousename = b.warehousename
where a.sumnum > b.sumnum;
...