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

Откуда:
Сообщений: 101
Пишу такой запрос

SELECT new2.*, most, dor FROM new2, dl1;
WHERE new2.cod = dl1.cod ;
UNION ;
SELECT new2.*, 0, 0 FROM new2 ;
WHERE new2.cod NOT IN (SELECT dl1.cod FROM dl1) ;
UNION ;
SELECT dl1.cod, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, most, dor; FROM dl1;
WHERE dl1.cod NOT IN (SELECT new2.cod FROM new2) ;
INTO CURSOR new

Запускаю его в Visual - все работает нормально.
Запускаю в DOS - пишет: "SELECTs are not UNION compatible"
(количество полей, используемых в каждом SELECT'e - 39)

Писал еще вот так :
zap1 = 'SELECT new2.*, most, dor FROM new2, dl1 WHERE
new2.cod = dl1.cod UNION SELECT new2.*, 0, 0 FROM new2 WHERE
new2.cod NOT IN (SELECT dl1.cod FROM dl1)'
zap2 = 'UNION SELECT dl1.cod, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, most, dor
FROM dl1 INTO CURSOR new'
z = zap1+zap2
&Z

В DOS'e выдает ту же ошибку(в Visual работает на ура)
В чем может быть причина?
21 янв 04, 14:56    [500994]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Crip
Member

Откуда:
Сообщений: 2490
А может проще append from dbf("MyCursor")
Вместо Union?
21 янв 04, 15:28    [501080]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Remans
Member

Откуда:
Сообщений: 101
Так Append from совсем же по другому работает.
Он же просто добавляет значения в конец таблицы.
А мне нужно объединение двух таблиц по кодам.
21 янв 04, 15:37    [501125]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Urri
Member

Откуда: Москва
Сообщений: 2693
Так сразу причину несовместимости не увидел. Посмотрел в help к FPD2.6 и увидел вот что:
Each column in the query results of one SELECT must have the same data type and width as the corresponding column in the other SELECT.

Т.е. если например в первом запросе 0, а во втором 000.0000 - то это уже повод подозревать несовместимость.

И еще рекомендация:
Не стоит в запросах вообще, а в union-соединяемых особенно писать *.
В процессе разработки структура таблицы меняется.
Может добавиться поле или измениться порядок полей - и запрос придется переписывать.
21 янв 04, 15:47    [501153]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Remans
Member

Откуда:
Сообщений: 101
Each column in the query results of one SELECT has the same data type as the corresponding column in the other SELECT.

Что касается width....

Я посредством нескольких (ок. 20-30) запросов я выбираю данные из множества таблиц и записываю их в одну результирующую таблицу.
До представленного выше, уже были написаны несколько Select'ов с той же конструкцией, и все работали нормально. Отличие лишь было в количестве используемых в запросе полей(оно было меньше).
т.е дело, наверное, не в width.
Может в FPD есть какое-то ограничение на количество используемых в запросе полей?
21 янв 04, 16:17    [501236]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Urri
Member

Откуда: Москва
Сообщений: 2693
Действительно, пока экспериментировал с константами - все получалось. Но попробовал такое:

create table x (a c(10), b c(20))
select a from x union select b from x

- и получил ошибку несовместимости.

Тогда как
select a from x union select left(b,10) from x
прошло.
Более того, прошло
select a from x union select left(b,20) from x
!

Т.е. несовместимость возникает при выборе только непосредственно из полей таблиц разной длины.

Насчет ограничений для запроса - они есть. И по количеству полей, и по длине строки запроса. Но 30 или 40 полей - это не предел. Я предела на практике не достигал. Вот длину строки запроса превысить - плевое дело. Но ошибка будет другая.
21 янв 04, 17:18    [501390]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Remans
Member

Откуда:
Сообщений: 101
create table x (a n(10), b n(20))
select a from x union select b from x


тоже не пашет
21 янв 04, 17:43    [501462]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Remans
Member

Откуда:
Сообщений: 101
To Urri
Как же тогда быть если тип - Numeric ( в моем случае все такие)
Что ты можешь мне посоветовать.

И я все-таки не пойму одного, ведь все подобные запросы до вышеописанного
нормально работали, хотя длины полей также не совпадали, почему ж этот -то не работает?
21 янв 04, 17:49    [501482]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Urri
Member

Откуда: Москва
Сообщений: 2693
А у new2.cod и dl1.cod часом длина не разная?
А поля most, dor есть только в dl1?
А физический порядок следования полей не нарушен?
21 янв 04, 17:51    [501490]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
golsa
Member

Откуда: Красноярск
Сообщений: 789
В DOS Fox 2.6 типы полей результирующего набора при UNION определяются по первому SELECTу .

Для NUMERIC полей прокатывает такой финт: nfield1+ 00000.00
22 янв 04, 04:22    [501799]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Remans
Member

Откуда:
Сообщений: 101
To Urri:
А у new2.cod и dl1.cod часом длина не разная?
нет, абсолютно одинаковая
А поля most, dor есть только в dl1?
да, только в dl1
А физический порядок следования полей не нарушен?
нет, не нарушен


Golsa
Для NUMERIC полей прокатывает такой финт: nfield1+ 00000.00

Что-то я не понял в чем смысл такого финта.
22 янв 04, 10:01    [502002]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Urri
Member

Откуда: Москва
Сообщений: 2693
Ну, если cod в new2 по порядку первый и числовой...

Модифицируем мой тестовый пример с учетом числовых полей:
create table x (a n(10), b n(12))
select a from x union select b from x && не работает
select a from x union select b+0 from x && работает


Ну попробуй изменить свой запрос таким образом:

SELECT new2.*, most, dor FROM new2, dl1;
WHERE new2.cod = dl1.cod ;
UNION ;
SELECT new2.*, 0, 0 FROM new2 ;
WHERE new2.cod NOT IN (SELECT dl1.cod FROM dl1) ;
UNION ;
SELECT dl1.cod+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, most+0, dor+0; FROM dl1;
WHERE dl1.cod NOT IN (SELECT new2.cod FROM new2) ;
INTO CURSOR new

Может, поможет?
22 янв 04, 10:55    [502156]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Urri
Member

Откуда: Москва
Сообщений: 2693
А вообще-то Crip правильно про append from говорил - тут ты сам создаешь структуру, которую надо, да и вообще, ситуация становится гораздо более управляемой.
22 янв 04, 10:58    [502166]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Ruslan Ibraev
Member

Откуда: Уфа
Сообщений: 163
Для таких select-ов мы в select пишем str(cod,10). Действительно, если в порядке обьединения в 1 запросе cod=0, создаётся поле N(1), затем во втором появляется 12 - уже ошибка. У меня часто такое бывало с Union.
22 янв 04, 11:04    [502193]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Remans
Member

Откуда:
Сообщений: 101
так append from же совсем по-другому работает.
Он же просто добавляет значения в конец таблицы не зависимо от поля кода
А мне же по сути дела нужен FULL JOIN.



Конструкция "most+0, dor+0; FROM dl1" - не работает
22 янв 04, 11:35    [502286]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Urri
Member

Откуда: Москва
Сообщений: 2693
И cod+0 надо тоже.

А по поводу append-а разжую применительно к твоему случаю:

SELECT new2.*, most, dor FROM new2, dl1;
WHERE new2.cod = dl1.cod ;
INTO TABLE temp_new
* (в FPD нет ронструкции into cursor readwrite).
SELECT new2.*, 0, 0 FROM new2 ;
WHERE new2.cod NOT IN (SELECT dl1.cod FROM dl1) ;
into cursor xxx
select temp_new
append from (dbf('xxx')
use in xxx
SELECT dl1.cod, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, most, dor; FROM dl1;
WHERE dl1.cod NOT IN (SELECT new2.cod FROM new2) ;
into cursor xxx
select temp_new
append from (dbf('xxx')
use in xxx
select * from temp_new into cursor new
use in temp_new
erase temp_new

Этот код аналогичен запросу с unions (на отсутствие ошибок не проверял)
22 янв 04, 11:53    [502347]     Ответить | Цитировать Сообщить модератору
 Re: SELECTs are not UNION compatible  [new]
Remans
Member

Откуда:
Сообщений: 101
cod+0 поставил - заработало !!! Спасибо всем.
Urri, за то, что разжевал (append from) - отдельная благодарность от компартии сельсовета Светлый Путь, хотя, и сам я, наверное, должен был додуматься.
22 янв 04, 13:37    [502645]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить