:: Visual Foxpro, Foxpro for DOS
SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Пусть имеется 3 dbf-таблицы.

sour1

kod1 N(4)
kod2 N(4)
kod3 N(4)
kolvo N(10,4)

sour2

kod1 N(4)
kod2 N(4)
nkod2 C(30)

sour3
kod1 N(4)
kod2 N(4)
kod3 N(4)
nkod3 C(30)

Надо получить выходную таблицу mytable структуры:

kod1, kod2, nkod2, kod3, nkod3, kolvo

Проблема состоит в том, что в sour1.kod2 и sour3.kod2 могут быть равны 0, а в sour2 будет отсутствовать запись с sour.kod2=0

Если сделать обычный запрос, то выпадут записи из таблицы sour3, где sour3.kod2=0, и при этом в sour2.kod2 будет отсутствовать запись с kod2=0

Реквизит kod1 во всех таблицах всегда ненулевой.

Можно ли в SQL-запросе так записать условие, чтобы выбрались из sour3 все записи?

Пример, конечно, условный и максимально упрощённый.



Исправлено 5 раз(а). Последнее : Simple777, 25.05.20 14:14
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
SELECT *
FROM a
LEFT OUTER JOIN b ON a.key = b.key

Почти равнозначен
SELECT *
FROM a, b
WHERE a.key = b.key OR b.key IS NULL

И почти равнозначен
SELECT *
FROM a, b
WHERE NVL(a.key = b.key, .T.)
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Печаль тов.Simple777 состоит в том, что в FPD left join-ов не было. Их надо было эмулировать. Когда-то я знал, как это делается. Сейчас, естественно, не помню.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Увы, но в FPD 2.6 таких опций для SQL-запросов нет.

Может быть, можно сделать вложенный запрос, в котором сначала выбрать все записи с sour1.kod2=0, а потом добавить эти записи в выходной файл, где "выпали" записи с suor3.kod2=0?
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Вот именно так это и делалось. Union, насколько я помню, там был. Впрочем, не уверен, что Вас правильно понял.



Исправлено 1 раз(а). Последнее : leonid, 25.05.20 14:52
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
leonid
Печаль тов.Simple777 состоит в том, что в FPD left join-ов не было. Их надо было эмулировать. Когда-то я знал, как это делается. Сейчас, естественно, не помню.

Не такая уж и печаль. Конечно, при помощи циклов я смогу "добрать" выпавшие записи. Тем более, что такие записи бывают очень редко, и их совсем немного.

Если ничего нельзя будет придумать, то так и сделаю. По времени это будет быстрее, нежели все записи формировать в циклах.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Union есть. Правда, не пользовался им ни разу - нужды не было.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Ну так попробуйте, это все писалось в одном запросе с Union.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
В UNION есть такой нюанс. В SELECT должны быть одинаковые столбцы.

В общем, получилось что-то такое:

SELECT sour1.kod1,sour1.kod2,sour2.nkod2,sour1.kod3,;
sour3.nkod3,sour1.kolvo;
FROM sour1, sour2, sour3;
WHERE sour1.kod1=sour2.kod1 AND sour1.kod2 = sour2.kod2;
AND sour1.kod1=sour3.kod1 AND sour1.kod2 = sour3.kod2 AND;
sour1.kod3=sour3.kod3;
UNION ALL;
SELECT sour1.kod1,sour1.kod2,sour3.nkod3 AS nkod2, sour1.kod1, sour3.nkod3, sour1.kolvo;
FROM sour1, sour3;
WHERE sour1.kod1=sour3.kod1 AND sour1.kod2 = sour3.kod2 AND;
sour1.kod3=sour3.kod3;
ORDER BY sour1.kod1 into table mytable

Такой запрос выполняется без сообщений об ошибках.
Хотя нет уверенности, что результат верный.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Simple777
В UNION есть такой нюанс. В SELECT должны быть одинаковые столбцы.
В общем, получилось что-то такое:

SELECT sour1.kod1,sour1.kod2,sour2.nkod2,sour1.kod3,;
sour3.nkod3,sour1.kolvo;
FROM sour1, sour2, sour3;
WHERE sour1.kod1=sour2.kod1 AND sour1.kod2 = sour2.kod2;
AND sour1.kod1=sour3.kod1 AND sour1.kod2 = sour3.kod2 AND;
sour1.kod3=sour3.kod3;
UNION ALL;
SELECT sour1.kod1,sour1.kod2,sour3.nkod3 AS nkod2, sour1.kod1, sour3.nkod3, sour1.kolvo;
FROM sour1, sour3;
WHERE sour1.kod1=sour3.kod1 AND sour1.kod2 = sour3.kod2 AND;
sour1.kod3=sour3.kod3;
ORDER BY sour1.kod1 into table mytable

Такой запрос выполняется без сообщений об ошибках.
Хотя нет уверенности, что результат верный.

Понятно, что результат будет неверный. Попрбуйте лучше так:

SELECT sour1.kod1,sour1.kod2,sour2.nkod2,sour1.kod3,;
sour3.nkod3,sour1.kolvo;
FROM sour1, sour2, sour3;
WHERE sour1.kod1=sour2.kod1 AND sour1.kod2 = sour2.kod2;
AND sour1.kod1=sour3.kod1 AND sour1.kod2 = sour3.kod2 AND;
sour1.kod3=sour3.kod3;
UNION ALL;
SELECT sour1.kod1,sour1.kod2,space(здесь нужно поставить число, чтобы длина поля получилась, как у sour2.nkod2) AS nkod2, sour1.kod1, sour3.nkod3, sour1.kolvo;
FROM sour1, sour3;
WHERE sour1.kod1=sour3.kod1 AND sour1.kod2 = sour3.kod2 AND;
sour1.kod3=sour3.kod3 AND sour1.kod2 = 0;
ORDER BY sour1.kod1 into table mytable
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Да, так будет правильнее.

Впрочем, одна проблема осталась. Даже и не проблема, а мелочь.

В реальной ситуации реквизитов kod больше. Когда я попытался встроить 2 раза подряд UNION ALL, выдаётся сообщение об ошибке, что не найдена колонка для одной из таблиц. По отдельности запросы UNION работают правильно.

Нашёл такой "выход из положения". Сначала отрабатывает основной SELECT и добавляется один UNION.
Потом отдельным запросом выполняется второй UNION. Далее первая выходная таблица дополняется по APPEND FROM. Потери времени минимальны.

Почему не работают подряд 2 UNION, так и осталось загадкой. В примерах на форуме использовалось даже 4 UNION подряд.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Simple777
Почему не работают подряд 2 UNION, так и осталось загадкой. В примерах на форуме использовалось даже 4 UNION подряд.
Количество полей во ВСЕХ запросах, связанных через UNION, должно совпадать. Для этого в запросах с меньшим количеством полей добавляют пустышки на соответствующие места.

------------------
Лень - это неосознанная мудрость.




Исправлено 1 раз(а). Последнее : ssa, 26.05.20 11:34
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Об этом я знаю. Даже проверял две выходных таблицы - от первого запроса и от второго. Структура, размер и тип полей идентичны. Пустышки добавлял. По отдельности запросы работают корректно.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Давай пример данных и запросы. Пока что обсуждаем сферического коня.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/1 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
ssa
Давай пример данных и запросы. Пока что обсуждаем сферического коня.

То же самое захотелось сказать при изучении условия.

Поскольку оно явно не содержит всех требований к решению - что же собственно требуется получить.
Для чего автору стоило бы приводить в качестве примера еще и собственно итоговую таблицу, какой она должна быть по выбранным данным, а не только по полям.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
В реальности используется с добрый десяток таблиц, и "выдрать" фрагмент не так-то просто. Не говоря уже о том, что данные надо "обезличить". Это потребует изрядного времени.

Вопрос ставится так: есть ли какие-то ограничения на использование более одного UNION в SQL-запросе, кроме тех, что перечислены в HELP?

Ещё раз повторю. Запросы по отдельности работают корректно. Структура выходных таблиц идентична. По APPEND FROM добавляется корректно.

Между "главной" таблицей (в примере sour1) и остальными таблицами условия связи устанавливаются по 3-4 кодовым реквизитам. В данном случае в запросах UNION используются разные таблицы. В первом UNION 4 таблицы, а во втором UNION 3 таблицы. Возможно, есть какие-то ограничения, и должно быть одинаковое число таблиц? Я пробовал добавить во второй UNION дополнительную таблицу (хотя она не используется в запросе), но все равно выдаётся ошибка.

Также не исключено, что в двух подряд UNION нельзя использовать опцию ALL. ХЗ.

Весьма вероятен и глюк FPD, проявляющийся при определённых условиях.

В любом случае проблема решена, и скорость SQL-запросов высокая, хотя и выполняется два отдельных запроса.



Исправлено 1 раз(а). Последнее : Simple777, 26.05.20 14:28
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Можно было бы ещё "поиграться", переставляя местами первый запрос и запросы UNION, но нет мотивации для этого.



Исправлено 1 раз(а). Последнее : Simple777, 26.05.20 14:31
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Simple777
В реальности используется с добрый десяток таблиц, и "выдрать" фрагмент не так-то просто. Не говоря уже о том, что данные надо "обезличить". Это потребует изрядного времени.
Было бы желание, то и все бы сделалось бы. Выбрать из каждой таблицы по паре-тройке записей и в них слегка покорежить данные не особо трудно, но некоторым и это лень.
Цитата:

Вопрос ставится так: есть ли какие-то ограничения на использование более одного UNION в SQL-запросе, кроме тех, что перечислены в HELP?

Ещё раз повторю. Запросы по отдельности работают корректно. Структура выходных таблиц идентична. По APPEND FROM добавляется корректно.

Между "главной" таблицей (в примере sour1) и остальными таблицами условия связи устанавливаются по 3-4 кодовым реквизитам. В данном случае в запросах UNION используются разные таблицы. В первом UNION 4 таблицы, а во втором UNION 3 таблицы. Возможно, есть какие-то ограничения, и должно быть одинаковое число таблиц? Я пробовал добавить во второй UNION дополнительную таблицу (хотя она не используется в запросе), но все равно выдаётся ошибка.

Также не исключено, что в двух подряд UNION нельзя использовать опцию ALL. ХЗ.

Весьма вероятен и глюк FPD, проявляющийся при определённых условиях.
Трудно искать черную кошку там, где её нет. Легче придумывать какие-то ограничения и тем самым сваливать вину себя. Ведь всегда в первую очередь глючит программа, а не прогер. Хотя мой немаленький опыт говорит, что на самом деле всё точностью до наоборот.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Мой немаленький опыт говорит, что глюков в FPD (а в VFP тем более) немеряно. Навскидку могу сказать, что примерно в 25% случаев, когда "что-то работало не так", это были глюки FPD. Одно время даже хотел записывать куда-нибудь выявленные глюки, да так не сподобился.

Из последних выявленных глюков - не более 26 параметров при использовании FUNCTION и более 50 параметров при использовании PROCEDURE. Думаю, что с доброй сотней такого рода глюков сталкивался сам лично.

В данном же случае нет никакого "навару" устанавливать ещё один глюк FPD. Проблема решена, и решена эффективно. [sm128]



Исправлено 2 раз(а). Последнее : Simple777, 26.05.20 15:55
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Simple777
Из последних выявленных глюков - не более 26 параметров при использовании FUNCTION
Разве это не записано в разделе ограничений? Насколько я помню, оно со времён FPD не менялось.
Хелп к VFP
Maximum # of passed parameters.
26
Simple777
В данном же случае нет никакого "навару" устанавливать ещё один глюк FPD
Чтобы назвать это глюком как раз и нужно выяснить что это именно глюк, а пока что видится именно твоя ошибка...
APPEND FROM проводит конвертацию типов полей (в т.ч. усекает данные в "разноразмерных"), и без проблем справляется с разным их количеством.
UNION ALL требует точного совпадения и порядка, и типов, и размеров полей. Особенно если среди списка полей для выбора есть выражения отличающиеся от "просто имя поля".


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 kornienko_ru  (Гостей: 21)

© 2000-2024 Fox Club 
Яндекс.Метрика