Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1158304611
Ragazor
2006-09-15 11:16
2006.10.29
DLL with MDI...


3-1157440210
ttt_111
2006-09-05 11:10
2006.10.29
Некорректный вывод числа при работе с БД.


15-1159596153
guard_gg
2006-09-30 10:02
2006.10.29
Не в тему, но все же вопросы к профессионалам Perl


8-1143444700
WondeRu
2006-03-27 11:31
2006.10.29
Как организовать прозрачное шифрование траффика в Indy 9?


2-1160997598
Volodya_
2006-10-16 15:19
2006.10.29
TImage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский