Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
Пишу такой запрос 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.01.2004, 14:56 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
А может проще append from dbf("MyCursor") Вместо Union? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2004, 15:28 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
Так Append from совсем же по другому работает. Он же просто добавляет значения в конец таблицы. А мне нужно объединение двух таблиц по кодам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2004, 15:37 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
Так сразу причину несовместимости не увидел. Посмотрел в 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.01.2004, 15:47 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
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.01.2004, 16:17 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
Действительно, пока экспериментировал с константами - все получалось. Но попробовал такое: 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.01.2004, 17:18 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
create table x (a n(10), b n(20)) select a from x union select b from x тоже не пашет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2004, 17:43 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
To Urri Как же тогда быть если тип - Numeric ( в моем случае все такие) Что ты можешь мне посоветовать. И я все-таки не пойму одного, ведь все подобные запросы до вышеописанного нормально работали, хотя длины полей также не совпадали, почему ж этот -то не работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2004, 17:49 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
А у new2.cod и dl1.cod часом длина не разная? А поля most, dor есть только в dl1? А физический порядок следования полей не нарушен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2004, 17:51 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
В DOS Fox 2.6 типы полей результирующего набора при UNION определяются по первому SELECTу . Для NUMERIC полей прокатывает такой финт: nfield1+ 00000.00 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 04:22 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
To Urri: А у new2.cod и dl1.cod часом длина не разная? нет, абсолютно одинаковая А поля most, dor есть только в dl1? да, только в dl1 А физический порядок следования полей не нарушен? нет, не нарушен GolsaДля NUMERIC полей прокатывает такой финт: nfield1+ 00000.00 Что-то я не понял в чем смысл такого финта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 10:01 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
Ну, если 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.01.2004, 10:55 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
А вообще-то Crip правильно про append from говорил - тут ты сам создаешь структуру, которую надо, да и вообще, ситуация становится гораздо более управляемой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 10:58 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
Для таких select-ов мы в select пишем str(cod,10). Действительно, если в порядке обьединения в 1 запросе cod=0, создаётся поле N(1), затем во втором появляется 12 - уже ошибка. У меня часто такое бывало с Union. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 11:04 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
так append from же совсем по-другому работает. Он же просто добавляет значения в конец таблицы не зависимо от поля кода А мне же по сути дела нужен FULL JOIN. Конструкция "most+0, dor+0; FROM dl1" - не работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 11:35 |
|
||
|
SELECTs are not UNION compatible
|
|||
|---|---|---|---|
|
#18+
И 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.01.2004, 11:53 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32383308&tid=1597287]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 256ms |
| total: | 405ms |

| 0 / 0 |
