powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Несколько join в запросе
9 сообщений из 9, страница 1 из 1
Несколько join в запросе
    #32427021
gray_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две таблицы :
Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE AZSNAME (
    AFS_ID   INTEGER NOT NULL PRIMARY KEY,
    NAME     CHAR( 10 ),
    ADRESS   VARCHAR( 200 ),
    N_OWNER  INTEGER
);

Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE GSM (
    DATA_PRIH     TIMESTAMP NOT NULL,
    AFS_ID        VARCHAR( 15 ) NOT NULL,    
    VALL          INTEGER,
    PRODCODE      INTEGER NOT NULL,
  );

поле PRODCODE принимает значения от 1 до 5
я пишу такой запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select AN.AFS_ID, sum(G1.VALL), sum(G2.VALL), sum(G3.VALL), sum(G4.VALL), sum(G5.VALL)
from AZSNAME AN left join GSM G1 on
cast(G1.AFS_ID as integer)=AN.AFS_ID and G1.DATA_PRIH=:DATA and G1.PRODCODE= 1 
left join GSM G2 on
cast(G2.AFS_ID as integer)=AN.AFS_ID and G2.DATA_PRIH=:DATA and G2.PRODCODE= 2 
left join GSM G3 on
cast(G3.AFS_ID as integer)=AN.AFS_ID and G3.DATA_PRIH=:DATA and G3.PRODCODE= 3 
left join GSM G4 on
cast(G4.AFS_ID as integer)=AN.AFS_ID and G4.DATA_PRIH=:DATA and G4.PRODCODE= 4 
left join GSM G5 on
cast(G5.AFS_ID as integer)=AN.AFS_ID and G5.DATA_PRIH=:DATA and G5.PRODCODE= 5 
group by AN.AFS_ID order by AN.AFS_ID

и он почему-то некоторые суммы (не по всем AFS_ID, а только по некоторым) считает в 2-4 раза больше чем они есть на самом деле. Никто не знает, в чём глюк?
Если оставить только один JOIN и считать соответственно группировку по одному PRODECODE, то считает правильно.
Сервер FB1.5 FINAL RELEASE
...
Рейтинг: 0 / 0
Несколько join в запросе
    #32427103
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На пальцах:
при левом соединении "влево" соединяем с правыми записями не только имеющими, но и не имеющими соотвествия, при этом "вправо" идет обычное (иннер) соединение, т.е. если для левой записи есть более 1 соотвествия справа, то оба они будут учтены и левая часть фактически удвоится (утроится, у...)
...
Рейтинг: 0 / 0
Несколько join в запросе
    #32427212
gray_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно от этого избавиться?
...
Рейтинг: 0 / 0
Несколько join в запросе
    #32427260
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
А можно от этого избавиться?


Можно. Но для этого надо разобраться с проектированием БД, со структурой таблиц и подучить SQL... :)

...
Рейтинг: 0 / 0
Несколько join в запросе
    #32427295
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Johnmen Можно. Но для этого надо разобраться с проектированием БД, со структурой таблиц и подучить SQL... :)


gray_k
Если не принимать во внимание высказываение Johnmen , то можно использовать ХП. Будет работать не медленнее чем твой запрос.


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Несколько join в запросе
    #32427298
srf2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
работать может и медленнее будет, но правильнее
...
Рейтинг: 0 / 0
Несколько join в запросе
    #32427333
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот можно так решить:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
FOR SELECT AFS_ID
  FROM AZSNAME
  ORDER BY AFS_ID
  INTO :AFS_ID
  DO BEGIN

    SUM1 =  0 ;
    SUM2 =  0 ;
    SUM3 =  0 ;
    SUM4 =  0 ;
    SUM5 =  0 ;

    SELECT SUM(VALL) FROM GSM
      WHERE CAST(AFS_ID AS INTEGER)=:AFS_ID AND DATA_PRIH=:DATA AND PRODCODE= 1 
      INTO :SUM1;

    SELECT SUM(VALL) FROM GSM
      WHERE CAST(AFS_ID AS INTEGER)=:AFS_ID AND DATA_PRIH=:DATA AND PRODCODE= 2 
      INTO :SUM2;

    SELECT SUM(VALL) FROM GSM
      WHERE CAST(AFS_ID AS INTEGER)=:AFS_ID AND DATA_PRIH=:DATA AND PRODCODE= 3 
      INTO :SUM3;

    SELECT SUM(VALL) FROM GSM
      WHERE CAST(AFS_ID AS INTEGER)=:AFS_ID AND DATA_PRIH=:DATA AND PRODCODE= 4 
      INTO :SUM4;

    SELECT SUM(VALL) FROM GSM
      WHERE CAST(AFS_ID AS INTEGER)=:AFS_ID AND DATA_PRIH=:DATA AND PRODCODE= 5 
      INTO :SUM5;

END


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Несколько join в запросе
    #32427443
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select AN.AFS_ID,
 sum(CASE G.PRODCODE WHEN  1  THEN G.VALL ELSE  0  END),
 sum(CASE G.PRODCODE WHEN  2  THEN G.VALL ELSE  0  END), 
 sum(CASE G.PRODCODE WHEN  3  THEN G.VALL ELSE  0  END),
 sum(CASE G.PRODCODE WHEN  4  THEN G.VALL ELSE  0  END),
 sum(CASE G.PRODCODE WHEN  5  THEN G.VALL ELSE  0  END)
from AZSNAME AN left join GSM G on
cast(G.AFS_ID as integer)=AN.AFS_ID and G.DATA_PRIH=:DATAgroup by AN.AFS_ID order by AN.AFS_ID
...
Рейтинг: 0 / 0
Несколько join в запросе
    #32427751
gray_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, про CASE я что-то не подумал.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Несколько join в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]