Форум: "Базы";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
ВнизЗапрос к 2м таблицам, объединенным отн. многие-ко-многим Найти похожие ветки
← →
Николай_Москва (2006-08-29 22:23) [0]Привет!
Есть одна проблема, переделкой структуры БД не решить, т.к. переделывать запрещено. Есть 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
Очевидно, что в лоб задачу не решить, какие могут быть правильные действия для решения проблемы. Сильно модифицировать структуру БД запрещено постановкой задачи.
Спасибо.
← →
Desdechado © (2006-08-29 22:44) [1]не понял, а по какому принципу получаем
1 - Банка - Подвал - 15
а не1 - Банка - Подвал - 20
из сути связи это никак не следует
← →
Николай_Москва (2006-08-29 22:49) [2]связи идут по первому столбцу (там идентификаторы пар) - в данном случае пара №1
← →
Desdechado © (2006-08-29 22:54) [3]ну, связь по первому столбцу
в обоих строках 1
как определить, для какой из двух строк какую из других двух строк другой таблицы дать 9естественно, при совпадении ID)
← →
Николай_Москва (2006-08-29 23:02) [4]объекты, находящиеся в первой и второй таблице не связаны между собой - связь формальная "по такой-то паре объектов была рассчитана такая-то пара значений", причем к какому объекту относится конкретный результат из пары - не важно, да и по задаче определить нельзя (результат получается из совокупности)
← →
ANB © (2006-08-30 09:27) [5]
> (результат получается из совокупности)
Ну и какая цифра должна быть для 1-й пары 15 или 20 ? Или их сумма ?
Вообще то запрос элементарный.
← →
Николай_Москва (2006-08-30 11:21) [6]для первой пары должен быть такой результат запроса
1 - Банка - Подвал - 15
1 - Крышка - На банке - 20
← →
Sergey13 © (2006-08-30 11:26) [7]> [6] Николай_Москва (30.08.06 11:21)
> для первой пары должен быть такой результат запроса
Если это жесткое условие, то задача на этой структуре нерешаема в принципе, ИМХО, так как нет номера строки в паре.
← →
Desdechado © (2006-08-30 12:02) [8]> для первой пары должен быть такой результат запроса
Почему не наоборот? И почему не 4 комбинации? По таблицам невозможно определить, что с чем связать для кода 1.
← →
ANB © (2006-08-30 12:51) [9]Телепатирую - для первой строки взять меньшее число, для второй - большее. Гы.
← →
Desdechado © (2006-08-30 13:40) [10]ANB © (30.08.06 12:51) [9]
а с огурцами - наоборот...
тренируйся :)
← →
fishka (2006-08-30 13:54) [11]Идея: в запросе к каждой из таблиц проставляется номер строке. Запросы соединяются по номерам строк.
Реализация (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
← →
ANB © (2006-08-30 13:56) [12]
> fishka (30.08.06 13:54) [11]
А номера строк сгенерятся как бог на душу положит :) Гы еще раз.
← →
fishka (2006-08-30 14:27) [13]
> А номера строк сгенерятся как бог на душу положит :) Гы
> еще раз.
Нет. Как индексы в таблицах назначены.
← →
ANB © (2006-08-30 14:41) [14]Вобщем то решение следующее :
1. Добавляем в обе таблицы по полю связки.
2. Ручками эти связки проставляем как надо.
3. Рисуем элементарный запрос.
← →
Desdechado © (2006-08-30 15:42) [15]Я бы обошелся проще.
Если известно, что всегда только пары, то почему их не загнать в одну запись вместо двух?
← →
ANB © (2006-08-30 16:26) [16]
> Desdechado © (30.08.06 15:42) [15]
Это уже значительная переделка структуры БД :)
← →
Николай_Москва (2006-08-30 18:10) [17]Спасибо, коллеги проблема решена. Уломал-таки изменить немного таблицы - ввести подя связки.
Спасибо за варианты.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.045 c