:: Visual Foxpro, Foxpro for DOS
Помогите с запросом
LadaDed

Сообщений: 144
Откуда: С. Пб
Дата регистрации: 29.01.2013
Добрый день!
Народ, помогите сделать запрос, а то уже 2-й день вожусь...
есть две таблицы, Правая и Левая.
Если в Левой таблице поле name совпадает с Правой и при этом там еще и выполняется условие (не пустые поля), нужно занести запись из Левой, а если не выполняется, то из Правой, (потому, что там хоть что-то есть)
Делал left outer join on name==name where условие, она накидала каких-то лишних записей. Там, в правой много мусора,
Вот, если бы она брала только первую запись из условия.. но как это ей объяснить!
*
Уже подмывает сделать do while и locate (это, конечно, не угроза.. но, если я разозлюсь, то могу!!
Ratings: 0 negative/0 positive
Re: Помогите с запросом
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Где попытка?
Где пример данных?
Как вы видите ответ?


------------------
Ratings: 0 negative/0 positive
Re: Помогите с запросом
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
Цитата:
Народ, помогите сделать запрос, а то уже 2-й день вожусь...
2 дня на запрос из двух таблиц со связкой по name?

LadaDed
есть две таблицы, Правая и Левая.
Если в Левой таблице поле name совпадает с Правой и при этом там еще и выполняется условие (не пустые поля), нужно занести запись из Левой, а если не выполняется, то из Правой, (потому, что там хоть что-то есть) есть две таблицы, Правая и Левая.
А куда заносятся данные если ваши условия ВДРУГ срабатывают?

LadaDed
Уже подмывает сделать do while и locate (это, конечно, не угроза.. но, если я разозлюсь, то могу!!
Вы 2 дня один запрос мучаете, еще не разозлились?

Аспид, вам всё верно написал, приложите хотя бы примерный код что вы пытаетесь сделать и хотя бы набросайте несколько записей в Правой и Левой таблицах, чтобы понять, что там у вас за "мусор", что вы хотите взять только первую запись из результата запроса...


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 1 раз(а). Последнее : Божья_коровка, 14.08.17 16:47
Ratings: 0 negative/0 positive
Re: Помогите с запросом
LadaDed

Сообщений: 144
Откуда: С. Пб
Дата регистрации: 29.01.2013
А какая разница, куда заносить данные? Ну, например, в курсор..
2 дня я вожусь - это шутка такая. Я, вообще-то, еще и работаю. А вечерком решил попробовать, что получится. Но просто не получилось.
Пример кода будет очень большой. Там много полей. Но, если настаиваете, то вот.

SELECT ;
Product.name AS name,;
NVL(Product.opt,0) AS opt,;
NVL(Product.price,0) AS price, ;
NVL(Product.zakupka,0) AS zakupka,;
NVL(Product_old_2017_08.categories,0) AS categories,;
NVL(Product.width_rul,0) AS width_rul,;
NVL(Product_old_2017_08.lenght_rul,0) AS lenght_rul,;
NVL(Product_old_2017_08.residual,0) AS residual,;
NVL(Product_old_2017_08.composit,0) AS composit,;
NVL(Product_old_2017_08.tint,0) AS tint,;
NVL(Product_old_2017_08.country,0) AS country,;
NVL(Product_old_2017_08.base,0) AS base,;
NVL(Product.supplier,0) AS supplier,;
NVL(Product_old_2017_08.design,0) AS design,;
NVL(Product_old_2017_08.pile,0) AS pile,;
NVL(Product_old_2017_08.fabric,0) AS fabric,;
NVL(Product_old_2017_08.anker,0) AS anker,;
NVL(Product_old_2017_08.euro,0) AS euro,;
;
NVL(Product_old_2017_08.euro_day,{}) AS euro_day,;
NVL(Product_old_2017_08.daylup,{}) AS daylup,;
;
NVL(Product_old_2017_08.mark,.f.) AS mark,;
NVL(Product_old_2017_08.favorite,.f.) AS favorite,;
NVL(Product_old_2017_08.sample,.f.) AS sample,;
NVL(Product_old_2017_08.optonly,.f.) AS optonly,;
;
NVL(Product_old_2017_08.ves_vors,"") AS ves_vors,;
NVL(Product_old_2017_08.color,"") AS color,;
NVL(Product_old_2017_08.ornament,"") AS ornament,;
NVL(Product_old_2017_08.foto,"") AS foto,;
NVL(Product_old_2017_08.nomer,"") AS nomer;
FROM Product left outer JOIN Product_old_2017_08;
ON;
UPPER(GETWORDNUM(Product.name,1)+GETWORDNUM(Product.name,2))==UPPER(GETWORDNUM(Product_old_2017_08.name,1)+GETWORDNUM(Product_old_2017_08.name,2));
where ;
Product_old_2017_08.categories#0 and Product_old_2017_08.pile#0;
order ;
BY Product.name;
into CURSOR proba
Ratings: 0 negative/0 positive
Re: Помогите с запросом
LadaDed

Сообщений: 144
Откуда: С. Пб
Дата регистрации: 29.01.2013
Проблема в том, что мне нужно получить только первое значение, а наполняются всеми, которые соответствуют условию. Я понимаю. что это правильно, но мне нужно не так.
Ratings: 0 negative/0 positive
Re: Помогите с запросом
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Что такое "первое значение"? Это если в каком порядке следования каких полей?
Ratings: 0 negative/0 positive
Re: Помогите с запросом
LadaDed

Сообщений: 144
Откуда: С. Пб
Дата регистрации: 29.01.2013
ну вот так
левая правая
======== ========
фффффффффф 0 0 0 фффффффффф 1 0 0
фффффффффф 1 1 1
фффффффффф 0 1 0
фффффффффф 0 0 0
ввввввв 1 1 1
ццццццц 0 1 1 цццццццццц 1 0 1
на выходе
================
фффффффффф 1 0 0
вввввввввв 1 1 1
цццццццццц 1 0 1

потому, что третье поле #0

*
В общем, количество записей на выходе должно быть равно количеству записей левой таблицы
Примерно, как если бы я делал set relation без set skip
Но тогда бы получилось, что на выходе я бы видел или попавшие в условие или пусто, а мне нужно тогда увидеть левую если выполнено условие where
Left Outer Join пробовал, почему-то не выходит, она все равно упорно добавляет все записи, которые попали в условие
Т.е. нужно как-то строже запрашивать.
Ratings: 0 negative/0 positive
Re: Помогите с запросом
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
...ни че не понял... посему принял...
Ratings: 0 negative/0 positive
Re: Помогите с запросом
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
LadaDed
А какая разница, куда заносить данные?
Никакой. Спрашивали о быборке, и тестовых данных.
LadaDed
Но, если настаиваете, то вот.
Да кто ж настаивает. У нас то выборки работают)
И на фига вы это привели?
Думаете яснее стало?
of63
...ни че не понял... посему принял...
+100500
Какой то сумбур в словах.
Автор конечно понимает (надеюсь) о чем речь. Но тщательно скрывает от нас.
А телепаты еще не подошли)

Еще раз.
Приведите тестовые данные, и четко опишите, что хотите получить.
Из вашего рассказа, с вашими терминами, понять что то крайне сложно.


------------------
Ratings: 1 negative/0 positive
Re: Помогите с запросом
Simple777

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

Можно привести код, реализующий "нужное" посредством циклов, а потом задать вопрос - как получить такую же выборку посредством SQL-запроса? Возможно, такой "алгоритм действий" покажется трудоемким для ТС (топикстартера), но в конечном итоге результат будет достигнут.
Ratings: 0 negative/0 positive
Re: Помогите с запросом
LadaDed

Сообщений: 144
Откуда: С. Пб
Дата регистрации: 29.01.2013
Блин, ну как спросить?
Нужен LEFT JOIN но чтобы в курсор попадала только одна запись из второй таблицы если она там есть.
Потому, что сейчас она набивает все, которые соответствуют условию ON
Ratings: 0 negative/0 positive
Re: Помогите с запросом
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
LadaDed
Блин, ну как спросить?
Нужен LEFT JOIN но чтобы в курсор попадала только одна запись из второй таблицы если она там есть.
Потому, что сейчас она набивает все, которые соответствуют условию ON

Дык, рисуешь репо-данные:

Create cursor Левая (Поле1 с(20), Поле2 с(20))
Create cursor Правая (Поле1 с(20), Поле2 с(20))
** Заполняешь курсоры
Insert into Левая (Поле1, Поле2) value ('AAAA', 'BBB')
Insert into Левая (Поле1, Поле2) value ('ВВВВ', 'BBB')
...
Insert into Правая (Поле1, Поле2) value ('AAAA', 'ССС')
** После этого пишешь, что долно получиться в результирующем курсоре, например:
AAAA, BBB, CCC
BBBB, BBB, null


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Помогите с запросом
ry

Сообщений: 2113
Дата регистрации: 24.09.2007
LadaDed
Блин, ну как спросить?
Нужен LEFT JOIN но чтобы в курсор попадала только одна запись из второй таблицы если она там есть.
Потому, что сейчас она набивает все, которые соответствуют условию ON

В таких случаях используют группировку, только надо четко определить ее критерии, т.е. какие именно записи из второй таблицы должны попадать в выборку, учитывая значение всех выбираемых полей. Если же дублирующиеся записи полностью идентичны, то должна сработать инструкция Distinct.
Ratings: 0 negative/0 positive
Re: Помогите с запросом
LadaDed

Сообщений: 144
Откуда: С. Пб
Дата регистрации: 29.01.2013
АгА, понял.. спасибо.
Ratings: 0 negative/0 positive
Re: Помогите с запросом
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
LadaDed
Проблема в том, что мне нужно получить только первое значение, а наполняются всеми, которые соответствуют условию. Я понимаю. что это правильно, но мне нужно не так.
В SQL для исходных таблиц не существует понятия "первой" или там "последней" записи. Язык манипулирует множествами, а во множестве ВСЕ записи совершенно равноправны. Множества могут упорядочиваться (это уже не исходная таблица, а некоторый подзапрос - т.е. РЕЗУЛЬТАТ некоторой обработки, а не сами исходные данные), тогда там в принципе появляется нечто похожее на "первую" запись - конечно же это будет не "первая попавшаяся", а именно первая при заданном порядке сортировки (если сортировка не однозначна, т.е. есть записи с одинаковыми значениями полей сортировки, то результат в общем случае непредсказуем - может быть выбрана "любая" запись и таких ситуаций следует избегать всеми силами). В фоксе в НЕКОТОРЫХ особых случаях можно использовать в качестве "уникального поля для сортировки" функцию RECNO() - но это опять же дурной тон и не понимая кучи тонкостей работы фоксового SQL написать корректный запрос не выйдет - лучше явно сделать в таблице уникальное поле и заполнить уникальными значениями (для начала сойдёт и тот же RECNO() ). Тогда можно будет в запросах выражать логику "взять данные из записи с минимальным полем id для указанного name".

"Схлопнуть" 100500 записей с одинаковым полем name (к примеру) в ОДНУ запись можно при помощи агрегирующих запросов, т.е. группировок. В фоксе их возможности ОЧЕНЬ скромны - можно брать для "прочих" полей лишь min/max/sum/count/avg... Хитрых LAST/FIRST операторов агрегации в фоксе нет - хотя в принципе они эмулируются при помощи достаточно массивных подзапросов.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Помогите с запросом
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
LadaDed
Если в Левой таблице поле name совпадает с Правой и при этом там еще и выполняется условие (не пустые поля), нужно занести запись из Левой, а если не выполняется, то из Правой, (потому, что там хоть что-то есть)
LadaDed
В общем, количество записей на выходе должно быть равно количеству записей левой таблицы

При такой постановке (мне) неясно, откуда брать данные, если:
1) для поля Name левой таблицы нет соответствующего значения в правой;
2) и особенно, если при этом нужные поля в левой - пустые.

Видимо, из левой, но в условии об этом ничего нет.

А вообще, я не сторонник того, чтобы всё, что возможно, получать исключительно запросами, даже если этот запрос будет выполнять задачу несущественно быстрее. Построение запроса не должно превращаться в самоцель.

Для сопровождения гораздо важнее ясность алгоритма. И разбирайся потом в хитросплетениях и искусственных примочках такого правильного запроса с подзапросами... Хорошо еще, если такое "наследство" достанется кому-то другому, но вдруг и сам автор доживет?

Здесь всего-то требуется просканировать левую таблицу, проверяя условие, и на основе этой проверки добавлять запись слева или справа.
Такой алгоритм будет понятен и автору и любому соавтору/наследнику через любое время и без приема лекарств, улучшающих память.
Ratings: 0 negative/0 positive
Re: Помогите с запросом
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
akvvohinc
Построение запроса не должно превращаться в самоцель.
Для сопровождения гораздо важнее ясность алгоритма.

Лучше и не скажешь!..

Каюсь, у меня всегда есть самоцель - ясность алгоритма. Вероятно, иногда это приводит не к самой "крутой" реализации посредством кода, но... Скорости нынче высоки, а ясность и надежность алгоритма таки поважнее "крутизны" будет. Конечно, "исключения возможны, если они гениальны". В целом же ясность и надежность кода - превыше всего. \m/ [sm128]



Исправлено 1 раз(а). Последнее : Simple777, 17.08.17 09:54
Ratings: 0 negative/0 positive
Re: Помогите с запросом
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Simple777
В целом же ясность и надежность кода - превыше всего.

Ну если ясный и понятный алгоритм жрёт 10 гиг памяти в то время как неочевидный и жутко запутанный алгоритм требует всего 500 метров при в 2 раза

большей скорости, то выбор в пользу первого алгоритма представляется варварским.
Ratings: 1 negative/0 positive
Re: Помогите с запросом
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
spinz
Simple777
В целом же ясность и надежность кода - превыше всего.

Ну если ясный и понятный алгоритм жрёт 10 гиг памяти в то время как неочевидный и жутко запутанный алгоритм требует всего 500 метров при в 2 раза

большей скорости, то выбор в пользу первого алгоритма представляется варварским.

Не, ну понятно, что иногда через анус употреблять алкоголь предпочтительнее. Один мужик так и делал, поскольку у него почти весь желудок вырезали. Правда, плохо кончил. Как-то влил две клизмы заместо одной, и таки "отдал швартовы". [sm128]
Ratings: 0 negative/0 positive
Re: Помогите с запросом
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
akvvohinc
При такой постановке (мне) неясно, откуда брать данные, если ...
А мне не ясно, точнее противно употребление "первой попавшейся" записи.
Это говорит об убогости применённой структуры данных, или же выбранного алгоритма.
Для нормальных систем не возникает такого рода потребностей - взять "абы чего, первое попавшееся".

По "логике" же, цикл scan вполне себе применимое средство - и даже set relation к нему впридачу, но только если это всё хорошо "заизолировано" от других частей кода. Т.к. когда некоторая таблица и в подобной процедуре обрабатывается scan-ом, и, заодно, в гридах отображается и в текстбоксах правится - то ничего хорошего от такой солянки ждать не приходится... Плюс SQL запроса в том, что он не мешает своим таблицам-источникам отображаться в UI контролах (игнорирует FILTER/RELATION/ORDER и прочие "настройки видимости и связи"). Для "чисто программного" же способа лучше и таблицы источники пооткрывать отдельно, под другими алиасами, хотя даже в этом случае возникнут некоторые конфликты/пересечения.


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


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

On-line: 20 (Гостей: 20)

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