Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Несколько join в запросе / 9 сообщений из 9, страница 1 из 1
01.03.2004, 19:27
    #32427021
gray_k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько join в запросе
Есть две таблицы :
Код: 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
01.03.2004, 21:59
    #32427103
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько join в запросе
На пальцах:
при левом соединении "влево" соединяем с правыми записями не только имеющими, но и не имеющими соотвествия, при этом "вправо" идет обычное (иннер) соединение, т.е. если для левой записи есть более 1 соотвествия справа, то оба они будут учтены и левая часть фактически удвоится (утроится, у...)
...
Рейтинг: 0 / 0
02.03.2004, 09:06
    #32427212
gray_k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько join в запросе
А можно от этого избавиться?
...
Рейтинг: 0 / 0
02.03.2004, 09:52
    #32427260
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько join в запросе
автор
А можно от этого избавиться?


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

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


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


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

Код: 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
02.03.2004, 11:24
    #32427443
Павел Воронцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько join в запросе
Код: 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
02.03.2004, 13:04
    #32427751
gray_k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько join в запросе
Спасибо, про CASE я что-то не подумал.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Несколько join в запросе / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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