
Есть главная таблица (с адресами). К ней придеталены 2 деталь-таблицы: одна с начислениями услуг за период, вторая - с проживающими по этому адресу за тот же период.
Задача: написать запрос, чтобы выходили (за период с даты по дату, разумеется) адреса, по которым проживающие, да не все, а скажем, ветераны труда. А потом к этим двум столбцам - еще несколько: "Холодная вода", "горячая вода", "вывоз мусора" и пр. Причем вся эта бодяга содержится в одной таблице - NACHISL. В одном столбце.
Пробуем использовать псевдонимы и директиву JOIN. В начале у меня выходили миллионы записей (хорошо IB_Expert дает возможность остановить фетч). Теперь поменьше, но все равно при объединении таблицы самой с собой происходит ПЕРЕМНОЖЕНИЕ. А это не есть гуд.
Вот мой запрос:
Код: Выделить всё
SELECT TM.ADRESS, NF.NAME_F, NF.KAT_NAME, NF.D_BORN, NF.DOCUM,
O.SRV_NAME, HV.SRV_NAME, GV.SRV_NAME, HA.SRV_NAME, GA.SRV_NAME, M.SRV_NAME, SN.SRV_NAME,
SB.SRV_NAME, E.SRV_NAME, LV.SRV_NAME, N.SRV_NAME
FROM THEMAIN TM join N_FAMILY NF on (nf.mid = tm.mid) and nf.kat_name containing 'Ветераны труда'
join nachisl O on (O.mid = tm.mid) and ((O.D_BEGIN >= '01.01.2005') and (O.D_END <= '31.01.2005'))
join nachisl HV on (HV.mid = tm.mid) and ((HV.D_BEGIN >= '01.01.2005') and (HV.D_END <= '31.01.2005'))
join nachisl GV on (GV.mid = tm.mid) and ((GV.D_BEGIN >= '01.01.2005') and (GV.D_END <= '31.01.2005'))
join nachisl HA on (HA.mid = tm.mid) and ((HA.D_BEGIN >= '01.01.2005') and (HA.D_END <= '31.01.2005'))
join nachisl GA on (GA.mid = tm.mid) and ((GA.D_BEGIN >= '01.01.2005') and (GA.D_END <= '31.01.2005'))
join nachisl M on (M.mid = tm.mid) and ((M.D_BEGIN >= '01.01.2005') and (M.D_END <= '31.01.2005'))
join nachisl SN on (SN.mid = tm.mid) and ((SN.D_BEGIN >= '01.01.2005') and (SN.D_END <= '31.01.2005'))
join nachisl SB on (SB.mid = tm.mid) and ((SB.D_BEGIN >= '01.01.2005') and (SB.D_END <= '31.01.2005'))
join nachisl E on (E.mid = tm.mid) and ((E.D_BEGIN >= '01.01.2005') and (E.D_END <= '31.01.2005'))
join nachisl LV on (LV.mid = tm.mid) and ((LV.D_BEGIN >= '01.01.2005') and (LV.D_END <= '31.01.2005'))
join nachisl N on (N.mid = tm.mid) and ((N.D_BEGIN >= '01.01.2005') and (N.D_END <= '31.01.2005'))
WHERE
( (O.SRV_NAME = 'Отопление') or (O.SRV_NAME IS NULL ) ) and
( (HV.SRV_NAME = 'Холодная вода') or (HV.SRV_NAME IS NULL ) ) and
( (GV.SRV_NAME = 'Горячая вода') or (GV.SRV_NAME IS NULL ) ) and
( (HA.SRV_NAME = 'Ассенизация с холодной водой') or (HA.SRV_NAME IS NULL ) ) and
( (GA.SRV_NAME = 'Ассенизация с горячей водой') or (GA.SRV_NAME IS NULL ) ) and
( (M.SRV_NAME = 'Вывоз мусора') or (M.SRV_NAME IS NULL ) ) and
( (SN.SRV_NAME = 'Содержание жилья (неблагоустроенного)') or (SN.SRV_NAME IS NULL ) ) and
( (SB.SRV_NAME = 'Содержание жилья (благоустроенного)') or (SB.SRV_NAME IS NULL ) ) and
( (E.SRV_NAME = 'Электроэнергия') or (E.SRV_NAME IS NULL ) ) and
( (LV.SRV_NAME = 'Летний водопровод') or (LV.SRV_NAME IS NULL ) ) and
( (N.SRV_NAME = 'Наем') or (N.SRV_NAME IS NULL ) )
Что я делаю неверно? Может, технология вообще другая должна быть? Или нельзя столько раз JOIN делать с одной и той же таблицей?
Понятно, что в окончательном варианте даты и "Ветераны труда" предполагается сделать параметрами.