![]() |
|
Модераторы: skyboy |
![]()
|
|
| tangar777 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 15.9.2010 Репутация: нет Всего: нет |
Всем привет. Столкнулся с проблемой, не могу разобраться.
Использую Delphi + база данных Paradox (dbExpress) Есть 2 таблицы. Первая - Register ID_Man - int Amb_karta - int Last_Name - string First_Name - string Father_Name - string Born_dat - date Вторая - osmotr_1 ID_Man {Остальные поля} Таблицы в программе связаны связаны связью 1(Register) ко многим(osmotr_1) Задача - вывести таблицу с данными людей из таблицы Register, и добавить колонку с количеством соответствующих записей из таблицы osmotr_1. Пока реализовал 1 метод, как это сделать, но он мне кажется неудобным: Первый метод:
Решил попробовать решить эту задачу через вложенные записи, написал такой код:
Но, он, к сожалению, нормально не работает - во вложенную запись, по-моему, не передается значение Register.ID_man. Если я его заменяю на цифру, то все работает прекрасно, а так - нет. Прылся в литературе, нашел аналогичный пример. В нем вроде как говорится что все должно работать.
Взято отсюда, смотреть чуть ниже, заголовок - Использование подзапросов Вообщем, убил пол дня на расхлебывание этой проблемы, и не знаю что делать. Хочется все-таки сделать запрос используя подзапросы, т.к. это будет значительно удобнее в дальнейшем совершенствовании данного запроса - будут добаваляться таблицы, аналогичные osmotr_1 с аналогичными целями. Сейчас склоняюсь к версии, что это ограничение используемого мною инструментария (Delphi+Paradox+dbExpress). Или же это банально кривизна рук и перегретые мозги? |
||||||
|
|||||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
А чем плох
Добавлено через 2 минуты и 11 секунд Вообще-то обычно не следует использовать подзапросы, когда этого можно избежать. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
local sql, на сколько я помню - вполне себе ограниченный движок.
Удивлен что он способен выполнить скалярный подзапрос. Не удивлен, что он не смог его кореллировать. В третий запросе собсна не стал вкуриваться. А чем, позвольте поинтересоваться, вас не устраивает первый вариант? Единственно - оставить группировку по ID, а к остальным полям дать аггрегаты min либо max. Врядли второй вариант будет весомо отличаться по производительности от первого. Добавлено @ 21:21 Akina, теперь ты первый Это сообщение отредактировал(а) Zloxa - 15.9.2010, 21:23 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| tangar777 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 15.9.2010 Репутация: нет Всего: нет |
Наличием дублирующихся названий полей в SELECT и ORDER BY ...
Проблема в том, что мне аналогичные сиквеловские запросы, только с значительно большим количеством полей надо составлять в процессе работы программы, грубо говоря выбирая галочками список нужных полей и нужных таблиц. И меня не покидает ощущение, что если я пойду таким путем, то в итоге буду получать "динозаврика" весьма немалых размеров, который с трудом будет поддаваться модификации ручками и осознаванию "что это такое и как оно работает". Возможно, я ввиду малой работы с сиквелом пытаюсь использовать тут другие подходы. Кстати, обнаружил в дельфятине забавную штуку - SQL Builder. В итоге, используя ее простенький интерфейс сумел не заморачиваясь с написанием кодов создать текст нужного мне запроса:
Все-таки интересно узнать - почему у меня не так как мне хочется работает код из первого примера. Работать-то работает, сообщение об ошибке не выводит... Может кто-то прояснит? Добавлено через 1 минуту и 20 секунд т.е. это проблема движка, я правильно понял? |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
А с какого перепугу, позвольте спросить, он ДОЛЖЕН туда передаваться? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| tangar777 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 15.9.2010 Репутация: нет Всего: нет |
В примере, который я нашел в справочнике по SQL (3й пример в 1м посту), подобная конструкция используется. Только если будете вникать в пример, смотрите его лучше не в этой ветке, а в первоисточнике - там есть внятные комментарии о том, что написано. В итоге, решение я реализовал без использования подзапросов, используя дельфовую программку SQL Builder, с последующей незначительной доработкой кода вручную. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
По этому вопросу лучше бы свериться с документацией, но полагаю что - да. Кстати, я не сразу обратил внимание, Akina, Вам предложил использовать внешнее соединение. Я нахожу это разумным. Это позволит не отсекать те случаи, когда отсутствуют записи в связанной таблице и такой вариант более близок ко второму прииведенному Вами варианту запроса. Вам не обязательно перечислять в group by все поля, которые вы хотите вывести в select-list, если хотябы одно из них является ключем. Вы можете в group by упомянуть только ключевое поле, а к остальным в селект-листе применить аггрегат min или max. При этом вы избежите громозкой сортировки при группировке но не потеряете в функционале. /*ой, кажись я об этом уже упоминал*/ Единственно, я не вполне уверен сможете ли вы потом отсортироваться по нужным полям. Local sql, на сколько я помню позволяет сортироваться по алиасу в select-листе, но я с этим движком знакомился очень давно и мог чтото запамятовать.
Хм... Я эту фразу ТС воспринял как "подзапрос не удалось корелировать" и, в этом контексте, я не понимаю твоего недоумения. Я чтото упустил? -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Ну... если подойти формально, то для подзапроса использование поля внешнего запроса эквивалентно использованию параметра, верно?не знаю, понимает ли собсно движок параметра, да и во что превратится план исполнения... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Ну, если я тебя правильно понял, то нет. В случае использования параметра, подзапрос необходимо выполнить лишь единожды и его результат вывести в каждой строке результирующей выборки. В случае использования корелированного подзапроса, подзапрос необходимо выполнить для каждой строки, либо же выполнить весьма нетривиальное преобразование его в джойн. Но вообще использование корелированных подзапросов - общепринятая практика и поддерживается ныне большинством движков.
Это сообщение отредактировал(а) Zloxa - 16.9.2010, 10:21 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |