powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SELECTs are not UNION compatible
17 сообщений из 17, страница 1 из 1
SELECTs are not UNION compatible
    #32383233
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу такой запрос

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 работает на ура)
В чем может быть причина?
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32383308
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может проще append from dbf("MyCursor")
Вместо Union?
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32383350
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так Append from совсем же по другому работает.
Он же просто добавляет значения в конец таблицы.
А мне нужно объединение двух таблиц по кодам.
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32383374
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так сразу причину несовместимости не увидел. Посмотрел в 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-соединяемых особенно писать *.
В процессе разработки структура таблицы меняется.
Может добавиться поле или измениться порядок полей - и запрос придется переписывать.
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32383453
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 есть какое-то ограничение на количество используемых в запросе полей?
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32383587
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, пока экспериментировал с константами - все получалось. Но попробовал такое:

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 полей - это не предел. Я предела на практике не достигал. Вот длину строки запроса превысить - плевое дело. Но ошибка будет другая.
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32383649
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
create table x (a n(10), b n(20))
select a from x union select b from x


тоже не пашет
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32383667
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Urri
Как же тогда быть если тип - Numeric ( в моем случае все такие)
Что ты можешь мне посоветовать.

И я все-таки не пойму одного, ведь все подобные запросы до вышеописанного
нормально работали, хотя длины полей также не совпадали, почему ж этот -то не работает?
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32383674
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у new2.cod и dl1.cod часом длина не разная?
А поля most, dor есть только в dl1?
А физический порядок следования полей не нарушен?
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32383922
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В DOS Fox 2.6 типы полей результирующего набора при UNION определяются по первому SELECTу .

Для NUMERIC полей прокатывает такой финт: nfield1+ 00000.00
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32384087
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Urri:
А у new2.cod и dl1.cod часом длина не разная?
нет, абсолютно одинаковая
А поля most, dor есть только в dl1?
да, только в dl1
А физический порядок следования полей не нарушен?
нет, не нарушен


GolsaДля NUMERIC полей прокатывает такой финт: nfield1+ 00000.00
Что-то я не понял в чем смысл такого финта.
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32384221
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, если 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

Может, поможет?
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32384230
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще-то Crip правильно про append from говорил - тут ты сам создаешь структуру, которую надо, да и вообще, ситуация становится гораздо более управляемой.
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32384248
Ruslan Ibraev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для таких select-ов мы в select пишем str(cod,10). Действительно, если в порядке обьединения в 1 запросе cod=0, создаётся поле N(1), затем во втором появляется 12 - уже ошибка. У меня часто такое бывало с Union.
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32384320
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так append from же совсем по-другому работает.
Он же просто добавляет значения в конец таблицы не зависимо от поля кода
А мне же по сути дела нужен FULL JOIN.



Конструкция "most+0, dor+0; FROM dl1" - не работает
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32384368
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И 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 (на отсутствие ошибок не проверял)
...
Рейтинг: 0 / 0
SELECTs are not UNION compatible
    #32384608
Remans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cod+0 поставил - заработало !!! Спасибо всем.
Urri, за то, что разжевал (append from) - отдельная благодарность от компартии сельсовета Светлый Путь, хотя, и сам я, наверное, должен был додуматься.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SELECTs are not UNION compatible
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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