| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > Подсчет записей в связанных таблицах БД Paradox. |
| Автор: tangar777 15.9.2010, 20:22 | ||||||
| Всем привет. Столкнулся с проблемой, не могу разобраться. Использую 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. Если я его заменяю на цифру, то все работает прекрасно, а так - нет. Прылся в литературе, нашел аналогичный пример. В нем вроде как говорится что все должно работать.
http://gsbelarus.com/gs/wiki/index.php/%D0%9A%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B9_%D0%BA%D1%83%D1%80%D1%81_SQL#.D0.9E.D0.B1.D1.8A.D0.B5.D0.B4.D0.B8.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5_.D1.80.D0.B5.D0.B7.D1.83.D0.BB.D1.8C.D1.82.D0.B0.D1.82.D0.BE.D0.B2_.D0.BD.D0.B5.D1.81.D0.BA.D0.BE.D0.BB.D1.8C.D0.BA.D0.B8.D1.85_.D0.B7.D0.B0.D0.BF.D1.80.D0.BE.D1.81.D0.BE.D0.B2 Вообщем, убил пол дня на расхлебывание этой проблемы, и не знаю что делать. Хочется все-таки сделать запрос используя подзапросы, т.к. это будет значительно удобнее в дальнейшем совершенствовании данного запроса - будут добаваляться таблицы, аналогичные osmotr_1 с аналогичными целями. Сейчас склоняюсь к версии, что это ограничение используемого мною инструментария (Delphi+Paradox+dbExpress). Или же это банально кривизна рук и перегретые мозги? |
| Автор: Akina 15.9.2010, 21:15 | ||
А чем плох
Добавлено через 2 минуты и 11 секунд Вообще-то обычно не следует использовать подзапросы, когда этого можно избежать. |
| Автор: Zloxa 15.9.2010, 21:20 |
| local sql, на сколько я помню - вполне себе ограниченный движок. Удивлен что он способен выполнить скалярный подзапрос. Не удивлен, что он не смог его кореллировать. В третий запросе собсна не стал вкуриваться. А чем, позвольте поинтересоваться, вас не устраивает первый вариант? Единственно - оставить группировку по ID, а к остальным полям дать аггрегаты min либо max. Врядли второй вариант будет весомо отличаться по производительности от первого. Добавлено @ 21:21 Akina, теперь ты первый |
| Автор: Akina 15.9.2010, 23:07 | ||
А с какого перепугу, позвольте спросить, он ДОЛЖЕН туда передаваться? |
| Автор: tangar777 16.9.2010, 08:59 | ||
В примере, который я нашел в справочнике по SQL (3й пример в 1м посту), подобная конструкция используется. Только если будете вникать в пример, смотрите его лучше не в этой ветке, а в первоисточнике - там есть внятные комментарии о том, что написано. В итоге, решение я реализовал без использования подзапросов, используя дельфовую программку SQL Builder, с последующей незначительной доработкой кода вручную. |
| Автор: Zloxa 16.9.2010, 09:28 | ||
По этому вопросу лучше бы свериться с документацией, но полагаю что - да. Кстати, я не сразу обратил внимание, Akina, Вам предложил использовать внешнее соединение. Я нахожу это разумным. Это позволит не отсекать те случаи, когда отсутствуют записи в связанной таблице и такой вариант более близок ко второму прииведенному Вами варианту запроса. Вам не обязательно перечислять в group by все поля, которые вы хотите вывести в select-list, если хотябы одно из них является ключем. Вы можете в group by упомянуть только ключевое поле, а к остальным в селект-листе применить аггрегат min или max. При этом вы избежите громозкой сортировки при группировке но не потеряете в функционале. /*ой, кажись я об этом уже упоминал*/ Единственно, я не вполне уверен сможете ли вы потом отсортироваться по нужным полям. Local sql, на сколько я помню позволяет сортироваться по алиасу в select-листе, но я с этим движком знакомился очень давно и мог чтото запамятовать.
Хм... Я эту фразу ТС воспринял как "подзапрос не удалось корелировать" и, в этом контексте, я не понимаю твоего недоумения. Я чтото упустил? |
| Автор: Akina 16.9.2010, 09:40 |
Ну... если подойти формально, то для подзапроса использование поля внешнего запроса эквивалентно использованию параметра, верно?не знаю, понимает ли собсно движок параметра, да и во что превратится план исполнения... |
| Автор: Zloxa 16.9.2010, 10:20 | ||
Ну, если я тебя правильно понял, то нет. В случае использования параметра, подзапрос необходимо выполнить лишь единожды и его результат вывести в каждой строке результирующей выборки. В случае использования корелированного подзапроса, подзапрос необходимо выполнить для каждой строки, либо же выполнить весьма нетривиальное преобразование его в джойн. Но вообще использование корелированных подзапросов - общепринятая практика и поддерживается ныне большинством движков.
|