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

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

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
21.01.2004, 17:43
    #32383649
Remans
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECTs are not UNION compatible
create table x (a n(10), b n(20))
select a from x union select b from x


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

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

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


GolsaДля NUMERIC полей прокатывает такой финт: nfield1+ 00000.00
Что-то я не понял в чем смысл такого финта.
...
Рейтинг: 0 / 0
22.01.2004, 10:55
    #32384221
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECTs are not UNION compatible
Ну, если 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
22.01.2004, 10:58
    #32384230
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECTs are not UNION compatible
А вообще-то Crip правильно про append from говорил - тут ты сам создаешь структуру, которую надо, да и вообще, ситуация становится гораздо более управляемой.
...
Рейтинг: 0 / 0
22.01.2004, 11:04
    #32384248
Ruslan Ibraev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECTs are not UNION compatible
Для таких select-ов мы в select пишем str(cod,10). Действительно, если в порядке обьединения в 1 запросе cod=0, создаётся поле N(1), затем во втором появляется 12 - уже ошибка. У меня часто такое бывало с Union.
...
Рейтинг: 0 / 0
22.01.2004, 11:35
    #32384320
Remans
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECTs are not UNION compatible
так append from же совсем по-другому работает.
Он же просто добавляет значения в конец таблицы не зависимо от поля кода
А мне же по сути дела нужен FULL JOIN.



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


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