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 |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
pasha_usue Сообщений: 3650 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Почти равнозначен
И почти равнозначен
|
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
leonid Сообщений: 3204 Откуда: Рига Дата регистрации: 03.02.2006 |
Печаль тов.Simple777 состоит в том, что в FPD left join-ов не было. Их надо было эмулировать. Когда-то я знал, как это делается. Сейчас, естественно, не помню.
|
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
Увы, но в FPD 2.6 таких опций для SQL-запросов нет.
Может быть, можно сделать вложенный запрос, в котором сначала выбрать все записи с sour1.kod2=0, а потом добавить эти записи в выходной файл, где "выпали" записи с suor3.kod2=0? |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
leonid Сообщений: 3204 Откуда: Рига Дата регистрации: 03.02.2006 |
Вот именно так это и делалось. Union, насколько я помню, там был. Впрочем, не уверен, что Вас правильно понял.
Исправлено 1 раз(а). Последнее : leonid, 25.05.20 14:52 |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
Не такая уж и печаль. Конечно, при помощи циклов я смогу "добрать" выпавшие записи. Тем более, что такие записи бывают очень редко, и их совсем немного. Если ничего нельзя будет придумать, то так и сделаю. По времени это будет быстрее, нежели все записи формировать в циклах. |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
Union есть. Правда, не пользовался им ни разу - нужды не было.
|
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
leonid Сообщений: 3204 Откуда: Рига Дата регистрации: 03.02.2006 |
Ну так попробуйте, это все писалось в одном запросе с Union.
|
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
В UNION есть такой нюанс. В SELECT должны быть одинаковые столбцы.
В общем, получилось что-то такое:
Такой запрос выполняется без сообщений об ошибках. Хотя нет уверенности, что результат верный. |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
leonid Сообщений: 3204 Откуда: Рига Дата регистрации: 03.02.2006 |
Понятно, что результат будет неверный. Попрбуйте лучше так:
|
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
Да, так будет правильнее.
Впрочем, одна проблема осталась. Даже и не проблема, а мелочь. В реальной ситуации реквизитов kod больше. Когда я попытался встроить 2 раза подряд UNION ALL, выдаётся сообщение об ошибке, что не найдена колонка для одной из таблиц. По отдельности запросы UNION работают правильно. Нашёл такой "выход из положения". Сначала отрабатывает основной SELECT и добавляется один UNION. Потом отдельным запросом выполняется второй UNION. Далее первая выходная таблица дополняется по APPEND FROM. Потери времени минимальны. Почему не работают подряд 2 UNION, так и осталось загадкой. В примерах на форуме использовалось даже 4 UNION подряд. |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
Количество полей во ВСЕХ запросах, связанных через UNION, должно совпадать. Для этого в запросах с меньшим количеством полей добавляют пустышки на соответствующие места. ------------------ Лень - это неосознанная мудрость. Исправлено 1 раз(а). Последнее : ssa, 26.05.20 11:34 |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
Об этом я знаю. Даже проверял две выходных таблицы - от первого запроса и от второго. Структура, размер и тип полей идентичны. Пустышки добавлял. По отдельности запросы работают корректно.
|
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
Давай пример данных и запросы. Пока что обсуждаем сферического коня.
------------------ Лень - это неосознанная мудрость. |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
То же самое захотелось сказать при изучении условия. Поскольку оно явно не содержит всех требований к решению - что же собственно требуется получить. Для чего автору стоило бы приводить в качестве примера еще и собственно итоговую таблицу, какой она должна быть по выбранным данным, а не только по полям. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
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 |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
Можно было бы ещё "поиграться", переставляя местами первый запрос и запросы UNION, но нет мотивации для этого.
Исправлено 1 раз(а). Последнее : Simple777, 26.05.20 14:31 |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
Было бы желание, то и все бы сделалось бы. Выбрать из каждой таблицы по паре-тройке записей и в них слегка покорежить данные не особо трудно, но некоторым и это лень. Цитата:Трудно искать черную кошку там, где её нет. Легче придумывать какие-то ограничения и тем самым сваливать вину себя. Ведь всегда в первую очередь глючит программа, а не прогер. Хотя мой немаленький опыт говорит, что на самом деле всё точностью до наоборот. ------------------ Лень - это неосознанная мудрость. |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
Мой немаленький опыт говорит, что глюков в FPD (а в VFP тем более) немеряно. Навскидку могу сказать, что примерно в 25% случаев, когда "что-то работало не так", это были глюки FPD. Одно время даже хотел записывать куда-нибудь выявленные глюки, да так не сподобился.
Из последних выявленных глюков - не более 26 параметров при использовании FUNCTION и более 50 параметров при использовании PROCEDURE. Думаю, что с доброй сотней такого рода глюков сталкивался сам лично. В данном же случае нет никакого "навару" устанавливать ещё один глюк FPD. Проблема решена, и решена эффективно. Исправлено 2 раз(а). Последнее : Simple777, 26.05.20 15:55 |
Re: SQL-запрос из нескольких таблиц FPD 2.6 | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Разве это не записано в разделе ограничений? Насколько я помню, оно со времён FPD не менялось.
Чтобы назвать это глюком как раз и нужно выяснить что это именно глюк, а пока что видится именно твоя ошибка... APPEND FROM проводит конвертацию типов полей (в т.ч. усекает данные в "разноразмерных"), и без проблем справляется с разным их количеством. UNION ALL требует точного совпадения и порядка, и типов, и размеров полей. Особенно если среди списка полей для выбора есть выражения отличающиеся от "просто имя поля". ------------------ WBR, Igor |
© 2000-2024 Fox Club  |