Помогите с запросом | |
---|---|
LadaDed Сообщений: 144 Откуда: С. Пб Дата регистрации: 29.01.2013 |
Добрый день!
Народ, помогите сделать запрос, а то уже 2-й день вожусь... есть две таблицы, Правая и Левая. Если в Левой таблице поле name совпадает с Правой и при этом там еще и выполняется условие (не пустые поля), нужно занести запись из Левой, а если не выполняется, то из Правой, (потому, что там хоть что-то есть) Делал left outer join on name==name where условие, она накидала каких-то лишних записей. Там, в правой много мусора, Вот, если бы она брала только первую запись из условия.. но как это ей объяснить! * Уже подмывает сделать do while и locate (это, конечно, не угроза.. но, если я разозлюсь, то могу!! |
Re: Помогите с запросом | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Где попытка?
Где пример данных? Как вы видите ответ? ------------------ |
Re: Помогите с запросом | |
---|---|
Божья_коровка Сообщений: 25720 Дата регистрации: 23.08.2001 |
Цитата:2 дня на запрос из двух таблиц со связкой по name? А куда заносятся данные если ваши условия ВДРУГ срабатывают? Вы 2 дня один запрос мучаете, еще не разозлились? Аспид, вам всё верно написал, приложите хотя бы примерный код что вы пытаетесь сделать и хотя бы набросайте несколько записей в Правой и Левой таблицах, чтобы понять, что там у вас за "мусор", что вы хотите взять только первую запись из результата запроса... ------------------ Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается... Исправлено 1 раз(а). Последнее : Божья_коровка, 14.08.17 16:47 |
Re: Помогите с запросом | |
---|---|
LadaDed Сообщений: 144 Откуда: С. Пб Дата регистрации: 29.01.2013 |
А какая разница, куда заносить данные? Ну, например, в курсор..
2 дня я вожусь - это шутка такая. Я, вообще-то, еще и работаю. А вечерком решил попробовать, что получится. Но просто не получилось. Пример кода будет очень большой. Там много полей. Но, если настаиваете, то вот.
|
Re: Помогите с запросом | |
---|---|
LadaDed Сообщений: 144 Откуда: С. Пб Дата регистрации: 29.01.2013 |
Проблема в том, что мне нужно получить только первое значение, а наполняются всеми, которые соответствуют условию. Я понимаю. что это правильно, но мне нужно не так.
|
Re: Помогите с запросом | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Что такое "первое значение"? Это если в каком порядке следования каких полей?
|
Re: Помогите с запросом | |
---|---|
LadaDed Сообщений: 144 Откуда: С. Пб Дата регистрации: 29.01.2013 |
ну вот так
потому, что третье поле #0 * В общем, количество записей на выходе должно быть равно количеству записей левой таблицы Примерно, как если бы я делал set relation без set skip Но тогда бы получилось, что на выходе я бы видел или попавшие в условие или пусто, а мне нужно тогда увидеть левую если выполнено условие where Left Outer Join пробовал, почему-то не выходит, она все равно упорно добавляет все записи, которые попали в условие Т.е. нужно как-то строже запрашивать. |
Re: Помогите с запросом | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
...ни че не понял... посему принял...
|
Re: Помогите с запросом | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Никакой. Спрашивали о быборке, и тестовых данных. Да кто ж настаивает. У нас то выборки работают) И на фига вы это привели? Думаете яснее стало? +100500 Какой то сумбур в словах. Автор конечно понимает (надеюсь) о чем речь. Но тщательно скрывает от нас. А телепаты еще не подошли) Еще раз. Приведите тестовые данные, и четко опишите, что хотите получить. Из вашего рассказа, с вашими терминами, понять что то крайне сложно. ------------------ |
Re: Помогите с запросом | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Вообще говоря, есть такой способ получения результата.
Можно привести код, реализующий "нужное" посредством циклов, а потом задать вопрос - как получить такую же выборку посредством SQL-запроса? Возможно, такой "алгоритм действий" покажется трудоемким для ТС (топикстартера), но в конечном итоге результат будет достигнут. |
Re: Помогите с запросом | |
---|---|
LadaDed Сообщений: 144 Откуда: С. Пб Дата регистрации: 29.01.2013 |
Блин, ну как спросить?
Нужен LEFT JOIN но чтобы в курсор попадала только одна запись из второй таблицы если она там есть. Потому, что сейчас она набивает все, которые соответствуют условию ON |
Re: Помогите с запросом | |
---|---|
PaulWist Сообщений: 14601 Дата регистрации: 01.04.2004 |
Дык, рисуешь репо-данные:
------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Помогите с запросом | |
---|---|
ry Сообщений: 2113 Дата регистрации: 24.09.2007 |
В таких случаях используют группировку, только надо четко определить ее критерии, т.е. какие именно записи из второй таблицы должны попадать в выборку, учитывая значение всех выбираемых полей. Если же дублирующиеся записи полностью идентичны, то должна сработать инструкция Distinct. |
Re: Помогите с запросом | |
---|---|
LadaDed Сообщений: 144 Откуда: С. Пб Дата регистрации: 29.01.2013 |
АгА, понял.. спасибо.
|
Re: Помогите с запросом | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
В SQL для исходных таблиц не существует понятия "первой" или там "последней" записи. Язык манипулирует множествами, а во множестве ВСЕ записи совершенно равноправны. Множества могут упорядочиваться (это уже не исходная таблица, а некоторый подзапрос - т.е. РЕЗУЛЬТАТ некоторой обработки, а не сами исходные данные), тогда там в принципе появляется нечто похожее на "первую" запись - конечно же это будет не "первая попавшаяся", а именно первая при заданном порядке сортировки (если сортировка не однозначна, т.е. есть записи с одинаковыми значениями полей сортировки, то результат в общем случае непредсказуем - может быть выбрана "любая" запись и таких ситуаций следует избегать всеми силами). В фоксе в НЕКОТОРЫХ особых случаях можно использовать в качестве "уникального поля для сортировки" функцию RECNO() - но это опять же дурной тон и не понимая кучи тонкостей работы фоксового SQL написать корректный запрос не выйдет - лучше явно сделать в таблице уникальное поле и заполнить уникальными значениями (для начала сойдёт и тот же RECNO() ). Тогда можно будет в запросах выражать логику "взять данные из записи с минимальным полем id для указанного name". "Схлопнуть" 100500 записей с одинаковым полем name (к примеру) в ОДНУ запись можно при помощи агрегирующих запросов, т.е. группировок. В фоксе их возможности ОЧЕНЬ скромны - можно брать для "прочих" полей лишь min/max/sum/count/avg... Хитрых LAST/FIRST операторов агрегации в фоксе нет - хотя в принципе они эмулируются при помощи достаточно массивных подзапросов. ------------------ WBR, Igor |
Re: Помогите с запросом | |
---|---|
akvvohinc Сообщений: 4203 Откуда: Москва Дата регистрации: 11.11.2008 |
При такой постановке (мне) неясно, откуда брать данные, если: 1) для поля Name левой таблицы нет соответствующего значения в правой; 2) и особенно, если при этом нужные поля в левой - пустые. Видимо, из левой, но в условии об этом ничего нет. А вообще, я не сторонник того, чтобы всё, что возможно, получать исключительно запросами, даже если этот запрос будет выполнять задачу несущественно быстрее. Построение запроса не должно превращаться в самоцель. Для сопровождения гораздо важнее ясность алгоритма. И разбирайся потом в хитросплетениях и искусственных примочках такого правильного запроса с подзапросами... Хорошо еще, если такое "наследство" достанется кому-то другому, но вдруг и сам автор доживет? Здесь всего-то требуется просканировать левую таблицу, проверяя условие, и на основе этой проверки добавлять запись слева или справа. Такой алгоритм будет понятен и автору и любому соавтору/наследнику через любое время и без приема лекарств, улучшающих память. |
Re: Помогите с запросом | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Лучше и не скажешь!.. Каюсь, у меня всегда есть самоцель - ясность алгоритма. Вероятно, иногда это приводит не к самой "крутой" реализации посредством кода, но... Скорости нынче высоки, а ясность и надежность алгоритма таки поважнее "крутизны" будет. Конечно, "исключения возможны, если они гениальны". В целом же ясность и надежность кода - превыше всего. Исправлено 1 раз(а). Последнее : Simple777, 17.08.17 09:54 |
Re: Помогите с запросом | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Ну если ясный и понятный алгоритм жрёт 10 гиг памяти в то время как неочевидный и жутко запутанный алгоритм требует всего 500 метров при в 2 раза большей скорости, то выбор в пользу первого алгоритма представляется варварским. |
Re: Помогите с запросом | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Не, ну понятно, что иногда через анус употреблять алкоголь предпочтительнее. Один мужик так и делал, поскольку у него почти весь желудок вырезали. Правда, плохо кончил. Как-то влил две клизмы заместо одной, и таки "отдал швартовы". |
Re: Помогите с запросом | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
А мне не ясно, точнее противно употребление "первой попавшейся" записи. Это говорит об убогости применённой структуры данных, или же выбранного алгоритма. Для нормальных систем не возникает такого рода потребностей - взять "абы чего, первое попавшееся". По "логике" же, цикл scan вполне себе применимое средство - и даже set relation к нему впридачу, но только если это всё хорошо "заизолировано" от других частей кода. Т.к. когда некоторая таблица и в подобной процедуре обрабатывается scan-ом, и, заодно, в гридах отображается и в текстбоксах правится - то ничего хорошего от такой солянки ждать не приходится... Плюс SQL запроса в том, что он не мешает своим таблицам-источникам отображаться в UI контролах (игнорирует FILTER/RELATION/ORDER и прочие "настройки видимости и связи"). Для "чисто программного" же способа лучше и таблицы источники пооткрывать отдельно, под другими алиасами, хотя даже в этом случае возникнут некоторые конфликты/пересечения. ------------------ WBR, Igor |
© 2000-2024 Fox Club  |