Каков наиболее эффективный способ выбора данных из нескольких таблиц в SQL? - PullRequest
0 голосов
/ 11 октября 2019

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

Например, с таблицами A, B, C, D :

  A              B                  C              D 
Id|Date     Id|Size|Price       Size|Dep       Code|Des
 1|1.2.19    3|  XL|10.00          L|AA          AA|Altora
 2|2.3.19    4|   L|10.00         XL|CC          BB|Barb
 3|2.7.19    5| XXL|10.00          S|DD          CC|Culic
 4|3.9.19    6|  XL|5.00         XXL|DD          DD|Dold
 5|4.9.19    4|   S|12.00        XXL|DD          EE|Elle

Я хотел бы суммировать B.price для каждого D.departement между определенными датами:

  • A -> B с Id
  • B -> C с Размер
  • C -> D с Код

На данный момент я достиг того, что хотел, написав несколько соединений.

select D.code, D.des, sum(B.price) 
from A
  join B on A.id = B.id
  join C on B.size = C.size
  join D on C.dep = D.code
where A.date between 1.1.19 and 6.1.19
group by D.dep, D.des

Есть ли более эффективный способ сделать это и / или мое решение правильно?

Ответы [ 2 ]

0 голосов
/ 12 октября 2019

За исключением неправильного условия соединения (C.dep = D.dep должно быть C.dep = D.code), ваше решение выглядит правильным с учетом предоставленной вами информации. Труднее судить об эффективности, но, вероятно, она достаточно эффективна. Я говорю это потому, что оптимизатор Firebird не так уж и хорош, поэтому иногда изменение порядка соединений в вашем запросе может повысить производительность запроса, тогда как в других системах баз данных оптимизатор сделает это за вас.

Кроме того, производительность может зависеть от наличия или отсутствия индексов для полей, которые вы присоединяете или используете в предложении where.

0 голосов
/ 11 октября 2019

Это отвечает первоначальной версии вопроса.

Вам, кажется, не нужны таблицы A или D:

select c.dep, sum(B.price) 
from B join
     C
     on B.size = C.size
group by c.dep;

Это равно Возможно, вам нужны таблицы. Они могут быть необходимы для фильтрации или умножения количества строк. Однако на основании select и данных выборки они не нужны.

...