|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Прочие БД - sql-запрос с join'ами |
|
Прочие БД - sql-запрос с join'ами
|
Старожил Сообщения: 164 |
Профиль | Отправить PM | Цитировать Всем привет.
Столкнулся со следующей проблемой: Пишу программу на яве, работающую с IBM DB2. В программе есть ситуация, в которой надо реализовать генерацию sql-запроса с join'ами для нескольких таблиц из базы. Программе известно какие поля необходимо получить и из каких таблиц, так же известно по средством каких полей связаны таблицы. Притом последнюю информацию достаю из системной таблицы SYSRELS, поэтому она как бы не в явной форме, ее приходится анализировать, да и всегда программа работает с разными БД. Знающие люди, подскажите как правильно составить этот sql-запрос, а то мой далеко не на всех ситуациях тестирование выдерживает. Как вообще из теории должен строиться такой запрос, а то может у меня в базовых знаниях проблемы, потому что с SQL впервые работаю. Спасибо. |
|
Отправлено: 20:13, 23-08-2009 |
Ветеран Сообщения: 5624
|
Профиль | Отправить PM | Цитировать M1sha, что вы хотите услышать от нас, если не привели никакой конкретной информации? Приведите свой пример, пример того, что нужно, и т.п. Писать вы можете на чем угодно, главное - какой SQL используется и т.п.
К примеру, только в Firebird есть 3 диалекта SQL, и ни один из них не похож на синтаксис SQL от MS SQL Server и другие языки. Конкретизируйте вопрос. |
------- Отправлено: 01:05, 24-08-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 164
|
Профиль | Отправить PM | Цитировать Хорошо, сейчас постараюсь раскрыть более подробно.
Возьмем такую базу: 5 таблиц, 4 связи. Теперь о программе..пользваотель запустил программу, выбрал нужные ему поля из разных таблиц и получил форма для просмотра данных. Допустим пользователь выбрал следующие поля: AUTO.REG_NOMER, AUTO.ID_COLOUR, COLOUR.COLOUR, VLAD.FAM, VLAD.NAME Дальше в программе анализирую с одной или с несколькими таблицами работает пользователь, после начинаю формировать sql-запрос. Из системной таблице беру информацию о том как связаны между собой таблицы..вот её фрагмент: Дальше начинаю формировать sql-запрос. В данной ситуации получается следующий: SELECT AUTO.REG_NOMER, AUTO.ID_COLOUR, COLOUR.COLOUR, VLAD.FAM, VLAD.NAME FROM COLOUR INNER JOIN AUTO ON COLOUR.ID_COLOUR=AUTO.ID_COLOUR INNER JOIN VLAD ON VLAD.ID_VLAD=AUTO.ID_VLAD + еще сортировку добавляю, но сейчас ее опустим, с ней все просто.. Теперь проблема. Проблема у меня со второй частью запроса, то есть то, что идет после FROM. Конечно в ряде случаев она генерируется удачно, но не во всех. Поэтому хочу спросить следующее: Есть ли какие-то строгие правила формирования таких запросов..ну что первым указывать, а что вторым? Может где-то можно найти примерный алгорит решения это задачи? может кто встречал? По поводу диалекта SQL не знаю что сказать. Я с ним работаю впервые и пока тяжело воспринимаю. Хочется начать с нуля..с простых вещей, все расмотреть, разобрать, но сейчас поджимает время и мою программу надо привести в рабочий вид, поэтому обращаюсь к вам. |
Отправлено: 18:35, 24-08-2009 | #3 |
Ветеран Сообщения: 5624
|
Профиль | Отправить PM | Цитировать Вы знаете, а я бы не стал так извращаться с динамической выборкой данных из нескольких таблиц. Я бы сделал проще:
Select vlad.*, [auto].*, dej.*, v_viezd.*, colour.* from vlad, [auto], dej, v_viezd, colour where [auto].id_vlad=vlad.id_vlad and auto.id_colour=color.id_colour and v_viezd.id_auto=auto.id_auto and dej.id_dej=v_viezd.id_dej В итоге я получу таблицу со ВСЕМИ полями из всех таблиц. И пользователь пусть себе выбирает столбцы какие хочет, те, что не будут выбраны, отображать не надо будет. А если уж вы хотите работать с JOIN'ами, то просто создайте копию таблиц в MS Access и мастером создайте запрос. Затем откройте запрос в виде SQL и получите готовый код со всеми полями и JOIN'ами |
------- Отправлено: 01:22, 25-08-2009 | #4 |
Старожил Сообщения: 164
|
Профиль | Отправить PM | Цитировать К сожалению моя программа и должна решать извращение с динамической выборкой Поэтому приходить к решению, с выбором всех полей не очень хочется...да и все равно его придется генерировать не через MS Access, а программно, посколько прога должна работать с ЛЮБОЙ БД.
Думаю решение с WHERE мне тоже не подойдет, ведь тут нет тех возможностей как с inner join, outer join (left, right, full) и cross join...хотя я могу ошибаться) Решил попробовать сделать запрос для все такблиц с JOIN'ами, но я немного недопонимаю как его строить.. SELECT *те таблицы, которые нам нужны* FROM *какую таблицу изначально указывать тут?* INNER JOIN *тут указывать ту, у которой первичный ключ или внешний?*ON COLOUR.ID_COLOUR=AUTO.ID_COLOUR Собственно вопросы в самом запросе. Спасибо. |
|
Последний раз редактировалось M1sha, 25-08-2009 в 12:32. Отправлено: 11:15, 25-08-2009 | #5 |
Ветеран Сообщения: 5624
|
Профиль | Отправить PM | Цитировать Цитата M1sha:
|
|
------- Отправлено: 01:04, 26-08-2009 | #6 |
Старожил Сообщения: 164
|
Профиль | Отправить PM | Цитировать Delirium, меня интересуется не столь сам запрос для этой базы, а как бы строгие правила построения таких запросов, потому что для широкого ряда выборок у меня удается его сгенерировать, но для некоторых нет..Я достаточно много гуглил, но что-то это в талковом виде не встретил
Цитата Delirium:
|
|
Отправлено: 10:16, 26-08-2009 | #7 |
Назгул Сообщения: 2633
|
Профиль | Отправить PM | Цитировать Лично я бы крайне не рекомендовал использовать JOIN при данных условиях (
Цитата M1sha:
1) JOIN как операция не входит в реляционную алгебру. 2) Каждая фирма реализует этот оператор по своему. В моей практике был случай когда при переходе с MS SQL 6.x на 7.0, 2000 производительность запросов резко упала (с полуторы минуты до 20 минут), проблема была связана именно со сменой MICROSOFT реализации JOIN (в 6й ветке он был "бинарным", а в 7й реализовывался SQL-интерпретатором при помощи вложенных SELECT) |
|
------- Отправлено: 22:50, 26-08-2009 | #8 |
Ветеран Сообщения: 5624
|
Профиль | Отправить PM | Цитировать Цитата M1sha:
Цитата M1sha:
А еще лучше - послушайте совета kim-aa, и реализовывайте не через JOIN. Через Where ваш запрос будет работать в любой БД и проблем меньше с этими INNER join, LEFT join и т.п. |
||
------- Отправлено: 01:10, 27-08-2009 | #9 |
Старожил Сообщения: 164
|
Профиль | Отправить PM | Цитировать Delirium, kim-aa, спасибо за разъяснения.
Цитата Delirium:
// 21:15 так же 15 записей получается даже в случае с одной таблицей 22:55 В принципе от этой проблемы избавился, используя в WHERE лишь те условия, который действительно нужны, то есть беру не все таблицы, а те, которые выбрал пльзователь. На следующей недел встречусь с людьми, которые работаю с DB2..поговорю о производительности и что мне лучше использовать. А пока благодарю все за помощь, за советы:-) |
|
Последний раз редактировалось M1sha, 27-08-2009 в 23:03. Отправлено: 21:02, 27-08-2009 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Delphi - [решено] SQL-запрос на Delphi | FRZ | Программирование и базы данных | 2 | 16-04-2009 15:42 | |
Разное - украшаем запрос MS SQL | pva | Программирование и базы данных | 26 | 16-10-2008 12:07 | |
sql запрос | Вебмастеру | 20 | 30-12-2006 22:31 | ||
SQL запрос | pauluss | Вебмастеру | 5 | 11-06-2004 09:14 | |
SQL-запрос | anridir | Программирование и базы данных | 2 | 23-09-2002 07:11 |
|