Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос к 2м таблицам, объединенным отн. многие-ко-многим [D7]


Николай_Москва ©   (2006-08-29 22:23:00) 

Привет!
Есть одна проблема, переделкой структуры БД не решить, т.к. переделывать запрещено. Есть Oracle9 + программа работы с БД на Дельфи 7. Теперь постановка задачи (упрощаю, оставляю только смысл). В БД есть две таблицы – главная и подчиненная, но связь по внешнему ключу подчиненной и главной отсутствует – удаление и контроль данных осуществляется с помощью триггеров.

Столбцы 1ой таблицы
Code – Код пары объектов, сюда при расчете заносятся объекты, выделенные в пары, парам присваивается числовой идентификатор. Таким образом, в таблице существуют описания пар (по две строки с одинаковым номером пары)
Name – название оборудования, входящего в пару
Местоположение – местоположение оборудования, входящего в пару.
Итак, главная таблица обеспечивает описание пар оборудования в двух строках, каждой паре присваивается код.

Столбцы 2ой таблицы
Code – Код пары объектов, сюда также на разных этапах расчета заносятся объекты, выделенные в пары, которым присвоен числовой номер, записанный также в первой таблице. Таким образом, в таблице существуют также описания тех же пар пар (по две строки с одинаковым номером пары)
Расчетные данные – данные, полученные в процессе расчета.

1ая таблица является главной по отношению ко второй, однако тип связи получается многие-ко-многим, конкретно 2 к 2. явную связь по ключу установить нельзя, поэтому связи отслеживаются с помощью триггеров (например, удаление данных). Теперь вопрос:
Требуется написать запрос к 1й и 2й таблице, результатом которого являлась бы следующая структура данных (первая часть результатов повторит содержимое 1ой таблицы):

Код пары 1 | Name (1я таблица) Оборудование 1| Местоположение (1я таблица) | Расчетные данные (2я таблица)
Код пары 1 | Name (1я таблица) Оборудование 2| Местоположение (1я таблица) | Расчетные данные (2я таблица)
Код пары 2 | Name (1я таблица) Оборудование 3| Местоположение (1я таблица) | Расчетные данные (2я таблица)
Код пары 2 | Name (1я таблица) Оборудование 4| Местоположение (1я таблица) | Расчетные данные (2я таблица)
Код пары 3 | Name (1я таблица) Оборудование 5| Местоположение (1я таблица) | Расчетные данные (2я таблица)
Код пары 3 | Name (1я таблица) Оборудование 6| Местоположение (1я таблица) | Расчетные данные (2я таблица)

То есть, SQL-запрос должен объединить пары (две строки) из 1й и 2й таблиц.

Попытался объяснить развернуто, теперь кратко:
Вот примеры данных таблиц:
1я таблица
1 - Банка - Подвал
1 - Крышка - Набанке
2 - Ведро - Огурцы
2 - Задача - Не решается
2я таблица
1 - 15
1 - 20
2 - 33
2 - 9
связаны только формально по парам (первый) столбец. И как сформировать SQL отчет вида
1 - Банка - Подвал - 15
1 - Крышка - На банке - 20
2 - Ведро - Огурцы - 33
2 - Задача - не решается - 9

Очевидно, что в лоб задачу не решить, какие могут быть правильные действия для  решения проблемы. Сильно модифицировать структуру БД запрещено постановкой задачи.
Спасибо.


Николай_Москва   (2006-08-30 18:10:00) [1]

Спасибо, коллеги проблема решена. Уломал-таки изменить немного таблицы - ввести подя связки.
Спасибо за варианты.


ANB   (2006-08-30 16:26:00) [2]


> Desdechado ©   (30.08.06 15:42) [15]

Это уже значительная переделка структуры БД :)


Desdechado   (2006-08-30 15:42:00) [3]

Я бы обошелся проще.
Если известно, что всегда только пары, то почему их не загнать в одну запись вместо двух?


ANB   (2006-08-30 14:41:00) [4]

Вобщем то решение следующее :
1. Добавляем в обе таблицы по полю связки.
2. Ручками эти связки проставляем как надо.
3. Рисуем элементарный запрос.


fishka   (2006-08-30 14:27:00) [5]


> А номера строк сгенерятся как бог на душу положит :) Гы
> еще раз.

Нет. Как индексы в таблицах назначены.


ANB   (2006-08-30 13:56:00) [6]


> fishka   (30.08.06 13:54) [11]

А номера строк сгенерятся как бог на душу положит :) Гы еще раз.


fishka   (2006-08-30 13:54:00) [7]

Идея: в запросе к каждой из таблиц проставляется номер строке. Запросы соединяются по номерам строк.
Реализация (MS SQL) см ниже:

select * from (select count (x_2.id_ves) as rank, x_1.id_ves, x_1.x25_ves
from x25_ves as x_1 inner join x25_ves as x_2 on
x_1.id_ves >= x_2.id_ves
group by x_1.id_ves, x_1.x25_ves) a
join (select count (x_2.id_own) as rank, x_1.id_own
from own as x_1 inner join own as x_2 on
x_1.id_own >= x_2.id_own
group by x_1.id_own) b
on a.rank=b.rank
order by a.rank


Desdechado   (2006-08-30 13:40:00) [8]

ANB ©   (30.08.06 12:51) [9]
а с огурцами - наоборот...
тренируйся :)


ANB   (2006-08-30 12:51:00) [9]

Телепатирую - для первой строки взять меньшее число, для второй - большее. Гы.


Desdechado   (2006-08-30 12:02:00) [10]

> для первой пары должен быть такой результат запроса
Почему не наоборот? И почему не 4 комбинации? По таблицам невозможно определить, что с чем связать для кода 1.


Sergey13   (2006-08-30 11:26:00) [11]

> [6] Николай_Москва   (30.08.06 11:21)
> для первой пары должен быть такой результат запроса

Если это жесткое условие, то задача на этой структуре нерешаема в принципе, ИМХО, так как нет номера строки в паре.


Николай_Москва   (2006-08-30 11:21:00) [12]

для первой пары должен быть такой результат запроса
1 - Банка - Подвал - 15
1 - Крышка - На банке - 20


ANB   (2006-08-30 09:27:00) [13]


> (результат получается из совокупности)

Ну и какая цифра должна быть для 1-й пары 15 или 20 ? Или их сумма ?

Вообще то запрос элементарный.


Николай_Москва   (2006-08-29 23:02:00) [14]

объекты, находящиеся в первой и второй таблице не связаны между собой - связь формальная "по такой-то паре объектов была рассчитана такая-то пара значений", причем к какому объекту относится конкретный результат из пары - не важно, да и по задаче определить нельзя (результат получается из совокупности)


Desdechado   (2006-08-29 22:54:00) [15]

ну, связь по первому столбцу
в обоих строках 1
как определить, для какой из двух строк какую из других двух строк другой таблицы дать 9естественно, при совпадении ID)


Николай_Москва   (2006-08-29 22:49:00) [16]

связи идут по первому столбцу (там идентификаторы пар) - в данном случае пара №1


Desdechado   (2006-08-29 22:44:00) [17]

не понял, а по какому принципу получаем
1 - Банка - Подвал - 15
а не
1 - Банка - Подвал - 20
из сути связи это никак не следует


Наверх

Титульная страница Поиск, карта сайта Написать письмо