Проблема запросов с UNION и INNER JOIN

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
TierIB
Сообщения: 1
Зарегистрирован: 12 ноя 2010, 14:52

Проблема запросов с UNION и INNER JOIN

Сообщение TierIB » 12 ноя 2010, 15:07

Уважаемые обитатели форума, может кто-нибудь поможет?
есть некий запрос

Код: Выделить всё

SELECT ZAY.Nomer as Z_Nom, ZAY.DATA_Z, ZAY.Time_Z,
   W.vid_rabot as W_vid,
   Tip.Neispr as T_Neisp,
Abonent.ID_LS as F_A_ID_LS
FROM ZAYAVKA ZAY
INNER JOIN FIO_Abonent Abonent ON ZAY.ID_LS = Abonent.ID_LS
    INNER JOIN Tip_Neispr Tip ON ZAY.ID_N = Tip.ID_N
    INNER JOIN Works W ON ZAY.ID_W = W.ID_W
WHERE (ZAY.DATA_Z BETWEEN '01.01.1000' AND '11.11.2010')
     union
SELECT ZAY.Nomer as Z_Nom, ZAY.DATA_Z, ZAY.Time_Z,
      W_P.vid_rabot_P as W_vid_P,
      Tip_P.Neispr_P as T_Neisp_P,
Abonent.ID_LS as F_A_ID_LS
FROM ZAYAVKA ZAY
INNER JOIN FIO_Abonent Abonent ON ZAY.ID_LS = Abonent.ID_LS
       INNER JOIN Tip_Neispr_PLAT Tip_P ON ZAY.ID_N_P = Tip_P.ID_N_P
       INNER JOIN Works_PLAT W_P ON ZAY.ID_W_P = W_P.ID_W_P
WHERE (ZAY.DATA_Z BETWEEN '01.01.1000' AND '11.11.2010')
OrDER BY 2, 3
объединение с 5 таблицами
причем union Для того чтобы объединитиь

Код: Выделить всё

  INNER JOIN Tip_Neispr_PLAT Tip_P ON ZAY.ID_N_P = Tip_P.ID_N_P
       INNER JOIN Works_PLAT W_P ON ZAY.ID_W_P = W_P.ID_W_P
т.к. в одной записи таблицы ZAYAVKA
поля имеют данные
W.vid_rabot as W_vid, 2 null
Tip.Neispr as T_Neisp, 3 null
W_P.vid_rabot_P as W_vid_P, null 3
Tip_P.Neispr_P as T_Neisp_P, null 4

но при этом запросе он создает связь с таблицами Tip_Neispr_PLAT и Works_PLAT но не создает поля W_vid_P и T_Neisp_P

пробовал сделать поля null
W.vid_rabot as W_vid,
Tip.Neispr as T_Neisp,
null as W_vid_P,
null as T_Neisp_P,
(для первой половины) и анологично для 2ой

но при этом пишет ошибку типа данных:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid command.
Data type unknown.


хотя по отдельности все работает

Код: Выделить всё

[i]SELECT ZAY.Nomer as Z_Nom, ZAY.DATA_Z, ZAY.Time_Z,
    W.vid_rabot as W_vid,
    Tip.Neispr as T_Neisp,
        W_P.vid_rabot_P as W_vid_P,
        Tip_P.Neispr_P as T_Neisp_P,
        Tip_P.stoimost as T_Stoim_P,
Abonent.ID_LS as F_A_ID_LS
FROM ZAYAVKA ZAY
INNER JOIN FIO_Abonent Abonent ON ZAY.ID_LS = Abonent.ID_LS
    left JOIN Tip_Neispr Tip ON ZAY.ID_N = Tip.ID_N
    left JOIN Works W ON ZAY.ID_W = W.ID_W
        left JOIN Tip_Neispr_PLAT Tip_P ON ZAY.ID_N_P = Tip_P.ID_N_P
        left JOIN Works_PLAT W_P ON ZAY.ID_W_P = W_P.ID_W_P
WHERE (ZAY.DATA_Z BETWEEN '11.11.2010' AND '11.11.2010')
and (Abonent.street  is not null)
and ( Abonent.House  is not null)
and ( Abonent.kv  is not null)[/i]
приложение пишу на делфи2009 IB6.5 и тут возникла новая проблема при частом выполнении запроса, а этот селект практически после каждого действия выполняется, т.к. он обновляет главную таблицу проги, происходит разрыв соединения с базой. Есть подозрения что происходит переполнения буфера,но как и как от него избавиться не знаю!

Может я не правильно использую UNION, перчитал кучу всего, но не встретил ни чего подобного.(( Хотелось бы без union как-то сделать иначе как-то некрасиво получается.
Может кто-нибудь подскажет??

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Проблема запросов с UNION и INNER JOIN

Сообщение Dimitry Sibiryakov » 13 ноя 2010, 15:05

У меня складывается впечатление, что ты никогда не слышал об outer join...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Проблема запросов с UNION и INNER JOIN

Сообщение kdv » 13 ноя 2010, 15:18

InterBase 6.5 давно умер. Дальше можно было бы не продолжать, но надо добавить что 6.5 как был, так и остался платным.

Ответить