Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 2 курсора соеденить в 1  [new]
alyssa
Member

Откуда: Бор, Нижегородская обл.
Сообщений: 47
написала 6 запросов. но последние 2 хочу сляпать в 1. у временных таблиц из этих запросов одинаковое кол-во столбцов и имена одинаковые у столбцов.

чтоб прониклись ситуацией, вот все 6:

1:
+
SELECT ;
  ORGBASE_1.RN, ;
  ORGBASE_1.SHOWNAME AS FIO, ;
  substr(ZSUBDIV_1.NAME,len(alltrim(ZSUBDIV_1.number))+2,len(alltrim(ZSUBDIV_1.name))-len(alltrim(ZSUBDIV_1.number))-1) as podrazdelenie, ;
  ZTIPDOL_1.NAME AS DOLJNOST, ;
  iif(ZFCAC_1.STARTDATE<=date(2010,1,1),iif(ZFCAC_1.endDATE>=date(2010,12,31),12,month(ZFCAC_1.endDATE)),iif(ZFCAC_1.endDATE>=date(2010,12,31),13-month(ZFCAC_1.startDATE),month(ZFCAC_1.endDATE)-month(ZFCAC_1.startDATE)+1)) AS Q_M, ;
  ZVIDISP_1.CODE AS VID_LIC, ;
  sum(ZHIS.SUM) as s1 ;
FROM ;
  ZHIS ;
    left join ZFCAC as ZFCAC_1 on (ZHIS.FCAC_RN = ZFCAC_1.FCAC_RN) ;
      left join ZANK as ZANK_1 on (ZFCAC_1.ANK_RN = ZANK_1.ANK_RN) ;
        left join ORGBASE as ORGBASE_1 on (ZANK_1.ORGBASE_RN = ORGBASE_1.RN) ;
      left join ZPOST as ZPOST_1 on (ZFCAC_1.POST_RN = ZPOST_1.POST_RN) ;
        left join ZSUBDIV as ZSUBDIV_1 on (ZPOST_1.SUBDIV_RN = ZSUBDIV_1.SUBDIV_RN) ;
        left join ZTIPDOL as ZTIPDOL_1 on (ZPOST_1.TIPDOL_RN = ZTIPDOL_1.TIPDOL_RN) ;
      left join ZVIDISP as ZVIDISP_1 on (ZFCAC_1.VIDISP_RN = ZVIDISP_1.VIDISP_RN) ;
    left join ZSNU as ZSNU_1 on (ZHIS.SNU_RN = ZSNU_1.SNU_RN) ;
 ;
WHERE (Zsnu_1.catalog_rn = "00Zт") AND  ;
  (Zhis.year = 2010) AND  ;
  ((Zsubdiv_1.name = "1")or(Zsubdiv_1.name = "2")) ;
GROUP BY ZVIDISP_1.CODE, ZHIS.ANK_RN ;
ORDER BY ORGBASE_1.SHOWNAME, ZVIDISP_1.CODE ;
INTO CURSOR SrZr01

2:
+
SELECT ;
  SRZR01.* ;
FROM ;
  SRZR01 ;
WHERE !(Srzr01.vid_lic = "Внут") ;
INTO CURSOR SrZr02

3:
+
SELECT ;
  SRZR01.* ;
FROM ;
  SRZR01 ;
WHERE (Srzr01.vid_lic = "Внут") ;
INTO CURSOR SrZr03

4:
+
SELECT ;
  SRZR03.RN, ;
  SRZR03.FIO, ;
  SRZR02.PODRAZDELENIE, ;
  SRZR02.DOLJNOST, ;
  SRZR02.Q_M, ;
  SRZR03.VID_LIC, ;
  SRZR03.S1 ;
FROM ;
  SRZR03 ;
    left join SRZR02 on (SRZR03.RN=SRZR02.RN) ;
INTO CURSOR SrZr04

5:
SELECT ;
  SRZR02.FIO, ;
  SRZR02.PODRAZDELENIE, ;
  SRZR02.DOLJNOST, ;
  SRZR02.VID_LIC, ;
  SRZR02.S1, ;
  SRZR02.S1/SRZR02.Q_M as s2 ;
FROM ;
  SRZR02 ;
INTO CURSOR SrZr05
6:
SELECT ;
  SRZR04.FIO, ;
  SRZR04.PODRAZDELENIE, ;
  SRZR04.DOLJNOST, ;
  SRZR04.VID_LIC, ;
  SRZR04.S1, ;
  SRZR04.S1/SRZR04.Q_M as s2 ;
FROM ;
  SRZR04 ;
INTO CURSOR SrZr06

Как же соединить их? Это возможно? Подскажите, пожалуйста
23 мар 11, 16:21    [10414818]     Ответить | Цитировать Сообщить модератору
 Re: 2 курсора соеденить в 1  [new]
PP762
Guest
Смело используй

автор
SELECT ;
SRZR02.FIO, ;
SRZR02.PODRAZDELENIE, ;
SRZR02.DOLJNOST, ;
SRZR02.VID_LIC, ;
SRZR02.S1, ;
SRZR02.S1/SRZR02.Q_M as s2 ;
FROM ;
SRZR02 ;
UNION ALL;
SELECT ;
SRZR04.FIO, ;
SRZR04.PODRAZDELENIE, ;
SRZR04.DOLJNOST, ;
SRZR04.VID_LIC, ;
SRZR04.S1, ;
SRZR04.S1/SRZR04.Q_M as s2 ;
FROM ;
SRZR04 ;
INTO CURSOR crs_tvoe
23 мар 11, 16:40    [10414948]     Ответить | Цитировать Сообщить модератору
 Re: 2 курсора соеденить в 1  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
У Вас не вполне правильное понимание того, как взаимодействуют LEFT JOIN и WHERE. В приведенном синтаксисе если условие отбора по таблице находится в директиве WHERE, то использование LEFT - бессмысленно. Поскольку такая комбинация будет работать как INNER JOIN

Другими словами Вам надо либо перенести все условия по таблицам, указанным в LEFT в условия объединения (в опцию ON), либо вместо LEFT JOIN использовать INNER JOIN. А то, что у Вас сейчас просто излишне усложняет и замедляет выполнение запроса. Если, конечно, предположить, что Вас не интересуют те записи таблицы ZHIS, которым нет соответствия в присоединенных по LEFT JOIN таблицах.

сравните

Create Cursor t1 (f1 i)
Insert into t1 values (1)
Insert into t1 values (2)

Create Cursor t2 (f1 i, f2 i)
Insert into t2 values (1, 1)
Insert into t2 values (2, 2)

* Это то, что делаете Вы
Select * from t1 left join t2 on t1.f1=t2.f1 where t2.f2 = 2

* А это то, что в принципе должно бы быть, если Вас интересует именно LEFT JOIN
Select * from t1 left join t2 on t1.f1=t2.f1 and t2.f2 = 2

* Если же LEFT JOIN не интересует, то проще использовать INNER JOIN
Select * from t1 INNER join t2 on t1.f1=t2.f1 where t2.f2 = 2
23 мар 11, 20:31    [10416012]     Ответить | Цитировать Сообщить модератору
 Re: 2 курсора соеденить в 1  [new]
PP762
Guest
Вот таких "оригиналов" берем - с ) С надждой что допетрят как тупо объеденить 2 таблицы.. ля начала. А Вы ему лекцию.
Он уже должен все знать.
24 мар 11, 02:29    [10416610]     Ответить | Цитировать Сообщить модератору
 Re: 2 курсора соеденить в 1  [new]
alyssa
Member

Откуда: Бор, Нижегородская обл.
Сообщений: 47
to PP762
спасибо, работает
to ВладимирМ
left join прописывает мастер запроса. потому как я его сначала с помощью мастера создаю, и только потом правлю в некоторых местах. Но быстродействие мне бы очень пригодилось. Спасибо за подсказку - теперь первый формируется не 150 а 10 сек.
24 мар 11, 09:34    [10416900]     Ответить | Цитировать Сообщить модератору
 Re: 2 курсора соеденить в 1  [new]
вадим славин
Member

Откуда:
Сообщений: 1
test test
28 мар 11, 12:09    [10432618]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить