| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > Прверить наличие определенной записи в таблице |
| Автор: Чoо 15.7.2010, 23:33 | ||||
| Вообще возможно составить такой запрос?, если да, то как он будет выглядеть? Что-то копал в сторону использования Exists и создания вычисляемого столбца, хранящего в записи истину или ложь, но так ни к чему и не пришел. вариант
не устраивает, так как Васей в таблице может быть много вот если бы можно было бы предыдущее выражение поместить в Exists, а результат ИСТИНА или ЛОЖЬ вернуть клиенту.. вариант
так же не устраивает, так как вась можеть быть очень много |
| Автор: Данкинг 15.7.2010, 23:54 |
А какой Вася нужен-то? |
| Автор: Чoо 16.7.2010, 00:03 | ||
| ну вообще вася приведен в качестве примера, а сама задача нетривиальная: Есть таблица TBL1, хранящая названия групп и их ID (ID - первичный ключ) Есть другая таблица TBL2, хранящая наименование объекта и в качестве его характеристик прочие поля + внешний ключ, ссылающийся на ID группы, таблицы TBL1). Объектов, ссылающихся на один и тот же ID может быть очень много. И теперь есть программа-клиент, которой при заполнении списка групп надо подсветить те группы, на которые есть ссылки в таблице TBL2. вобщем нужно произвести действие, аналогичное компоненту доступа к данным Table.Locate(<поле>, прочие параметры), только курсор не нужно устанавливать. может так сделать?
или все-таки есть способ получить результат проверки exists(), что было бы предпочтительней? |
| Автор: chip_and_dayl 16.7.2010, 01:00 |
| А если сделать левое внешнее объединение. Поля или поле со второй таблицы скрыть. И проверять, если нил, то нету ссылки, если не нил, то есть ссылка Добавлено через 3 минуты и 30 секунд То беж результатом должно быть поля с Таблицы 1 поля с Таблицы 2 ИД Название_группы ИД_ссылающий_на_таблицу_1 Поле ИД_ссылающий_на_таблицу_1 в программе скрываем, оно служит в качестве вычисляемого поля, где нил или значение |
| Автор: skyboy 16.7.2010, 01:41 |
| два запроса. первый - выбор списка групп. второй - select distinct(id_group) from tbl2 недостаток - разделение данных, относящихся к одному объекту. достоинство - если есть дополнительная фильтрация в списке групп и/или разбивка по количеству(страничность), то во втором вопросе вернутся только "признаки" для выбранных групп. вариант с внешним объединением лично мне не по душе тем, что либо группировку придется использовать, либо же получится потенциально довольно внушительный результат соединения таблиц. |
| Автор: Чoо 16.7.2010, 01:42 | ||
chip_and_dayl, тоесть сделать так?:
но ведь в этом случае я от сервера получу весь столбец ID, только строки, не соответствующие первичному ключу первой таблицы будут заполнены NULL |
| Автор: skyboy 16.7.2010, 01:45 | ||||
если групп немного, то можно попробовать разбить запрос на два:
все же внешнее соединени, да правда, при наличии индекса на tbl2.id_group должно шустро работать. Добавлено @ 01:49 хотя, можно и запрос с existsin проверить. наверное, скорость будет не ниже.
тут было ошибочное использование конструкции exists по форме конструкции in. перепутал, извините. |
| Автор: skyboy 16.7.2010, 02:24 |
ну, поле-признак в результате запроса. "0" - значит отсутствует в связанной таблице, "1" - присутствует. да, наверное. вот только что понял, что я неправильно использовал конструкцию exists. в моем варианте вместо "exists in" надо оставить просто "in" грубая синтаксическая ошибка, обидно :( |
| Автор: Чoо 16.7.2010, 02:43 |
| skyboy, синтаксическую ошибку я исправил сразу, но вот на поле-признак сервер ругаетcя. (firebird 2.1) Добавлено через 13 минут и 14 секунд без единицы и нуля получаю список ID первой таблицы. Без объединения (только первый запрос) получаю ID, на которые есть внешние ключи во второй таблице (разумеется без дубликатов). Ну и только второй запрос - ID, на которые нет внешних ключей. |
| Автор: Чoо 16.7.2010, 03:10 | ||||||
здесь я ошибся конечно.. exists будетвсегда возвращать истину, если хотя бы один внешний ключ ссылается на первую таблицу надо было так:
но все-равно это не то.. Или сервер от этого сильно не напрягается? |
| Автор: Чoо 16.7.2010, 03:26 |
| skyboy, в принципе вариант похож на ваш, только мне придется делать два запроса: получать сначала группЫ, на которые есть внешние ключи, а затем группы, на которые нет внешних ключей. Если учесть, что список групп всегда загружается полностью (он тож группируется, так что даже если групп будет около сотни, они в разных категориях и пользователь без труда сможет с ними разобраться), а так же, что exists вернет истину как только найдет нужное значение, то в принципе лишних действий не производится, лишний тарфик не генерируется и вобщем все норм. Но существует ли более изящный способ? *** извиняюсь за сообщения подряд - все не привыкну, что они не склеиваются. |
| Автор: Zloxa 16.7.2010, 08:57 | ||||
|
| Автор: Чoо 16.7.2010, 12:59 |
| Zloxa, ух ты, то что нужно Всем спасибо за помощь, вопрос решен |