![]() |
|
Модераторы: skyboy |
![]()
|
|
| Чoо |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
Вообще возможно составить такой запрос?, если да, то как он будет выглядеть?
Что-то копал в сторону использования Exists и создания вычисляемого столбца, хранящего в записи истину или ложь, но так ни к чему и не пришел. вариант
не устраивает, так как Васей в таблице может быть много вот если бы можно было бы предыдущее выражение поместить в Exists, а результат ИСТИНА или ЛОЖЬ вернуть клиенту.. вариант
так же не устраивает, так как вась можеть быть очень много Это сообщение отредактировал(а) Чoо - 15.7.2010, 23:49 -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
||||
|
|||||
| Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 1 Всего: 130 |
А какой Вася нужен-то? -------------------- There's nothing left but silent epitaphs. |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
ну вообще вася приведен в качестве примера, а сама задача нетривиальная:
Есть таблица TBL1, хранящая названия групп и их ID (ID - первичный ключ) Есть другая таблица TBL2, хранящая наименование объекта и в качестве его характеристик прочие поля + внешний ключ, ссылающийся на ID группы, таблицы TBL1). Объектов, ссылающихся на один и тот же ID может быть очень много. И теперь есть программа-клиент, которой при заполнении списка групп надо подсветить те группы, на которые есть ссылки в таблице TBL2. вобщем нужно произвести действие, аналогичное компоненту доступа к данным Table.Locate(<поле>, прочие параметры), только курсор не нужно устанавливать. может так сделать?
или все-таки есть способ получить результат проверки exists(), что было бы предпочтительней? Это сообщение отредактировал(а) Чoо - 16.7.2010, 00:33 -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| chip_and_dayl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 603 Регистрация: 22.4.2007 Где: Украина, Киев Репутация: нет Всего: 9 |
А если сделать левое внешнее объединение. Поля или поле со второй таблицы скрыть. И проверять, если нил, то нету ссылки, если не нил, то есть ссылка
Добавлено через 3 минуты и 30 секунд То беж результатом должно быть поля с Таблицы 1 поля с Таблицы 2 ИД Название_группы ИД_ссылающий_на_таблицу_1 Поле ИД_ссылающий_на_таблицу_1 в программе скрываем, оно служит в качестве вычисляемого поля, где нил или значение -------------------- Фсё будет хорошо!!! |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
два запроса. первый - выбор списка групп.
второй - select distinct(id_group) from tbl2 недостаток - разделение данных, относящихся к одному объекту. достоинство - если есть дополнительная фильтрация в списке групп и/или разбивка по количеству(страничность), то во втором вопросе вернутся только "признаки" для выбранных групп. вариант с внешним объединением лично мне не по душе тем, что либо группировку придется использовать, либо же получится потенциально довольно внушительный результат соединения таблиц. |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
chip_and_dayl, тоесть сделать так?:
но ведь в этом случае я от сервера получу весь столбец ID, только строки, не соответствующие первичному ключу первой таблицы будут заполнены NULL -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| skyboy |
|
||||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
если групп немного, то можно попробовать разбить запрос на два:
все же внешнее соединени, да правда, при наличии индекса на tbl2.id_group должно шустро работать. Добавлено @ 01:49 хотя, можно и запрос с existsin проверить. наверное, скорость будет не ниже.
тут было ошибочное использование конструкции exists по форме конструкции in. перепутал, извините. Это сообщение отредактировал(а) skyboy - 16.7.2010, 02:29 |
||||
|
|||||
| Чoо |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
так? пока писал вы уже ответили. Читаю Добавлено через 9 минут и 46 секунд skyboy, а что означают цифры 1 и 0? Это сообщение отредактировал(а) Чoо - 16.7.2010, 01:50 -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
||||
|
|||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
ну, поле-признак в результате запроса. "0" - значит отсутствует в связанной таблице, "1" - присутствует. да, наверное. вот только что понял, что я неправильно использовал конструкцию exists. в моем варианте вместо "exists in" надо оставить просто "in" грубая синтаксическая ошибка, обидно :( |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
skyboy, синтаксическую ошибку я исправил сразу, но вот на поле-признак сервер ругаетcя. (firebird 2.1)
Добавлено через 13 минут и 14 секунд без единицы и нуля получаю список ID первой таблицы. Без объединения (только первый запрос) получаю ID, на которые есть внешние ключи во второй таблице (разумеется без дубликатов). Ну и только второй запрос - ID, на которые нет внешних ключей. -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| Чoо |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
здесь я ошибся конечно.. exists будетвсегда возвращать истину, если хотя бы один внешний ключ ссылается на первую таблицу надо было так:
но все-равно это не то.. Или сервер от этого сильно не напрягается? Это сообщение отредактировал(а) Чoо - 16.7.2010, 03:16 -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
||||||
|
|||||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
skyboy, в принципе вариант похож на ваш, только мне придется делать два запроса: получать сначала группЫ, на которые есть внешние ключи, а затем группы, на которые нет внешних ключей.
Если учесть, что список групп всегда загружается полностью (он тож группируется, так что даже если групп будет около сотни, они в разных категориях и пользователь без труда сможет с ними разобраться), а так же, что exists вернет истину как только найдет нужное значение, то в принципе лишних действий не производится, лишний тарфик не генерируется и вобщем все норм. Но существует ли более изящный способ? *** извиняюсь за сообщения подряд - все не привыкну, что они не склеиваются. Это сообщение отредактировал(а) Чoо - 16.7.2010, 03:27 -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| Zloxa |
|
||||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Это сообщение отредактировал(а) Zloxa - 16.7.2010, 08:59 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
||||
|
|||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
Zloxa, ух ты, то что нужно
Всем спасибо за помощь, вопрос решен -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |