Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Перекрестный поиск по 4 таблицам / 8 сообщений из 8, страница 1 из 1
15.08.2002, 17:29:44
    #32043681
Nickolay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестный поиск по 4 таблицам
Уважаемые гуру и эксперты SQL подскажите с решением!

Упрощенная схема базы такова:

CREATE TABLE Container (
ID int IDENTITY (1, 1) NOT NULL ,
Rank int NOT NULL ,
HiA float NOT NULL ,
LoA float NOT NULL ,
HiB float NOT NULL ,
LoB float NOT NULL ,
CONSTRAINT С_Container UNIQUE NONCLUSTERED ( ID ) ON PRIMARY
) ON PRIMARY

CREATE TABLE Link (
ObjectID int NOT NULL ,
ContainerID int NULL ,
PropID int NOT NULL ,
CONSTRAINT С_LinkContainer FOREIGN KEY ( ContainerID )
REFERENCES Container ( ID ),
CONSTRAINT С_LinkObject FOREIGN KEY ( ObjectID )
REFERENCES Object ( ID ),
CONSTRAINT С_LinkProperties FOREIGN KEY ( PropID )
REFERENCES Properties ( ID )
) ON PRIMARY

CREATE TABLE Object (
ID int IDENTITY (1, 1) NOT NULL ,
CONSTRAINT С_Object UNIQUE NONCLUSTERED ( ID ) ON PRIMARY
) ON PRIMARY

CREATE TABLE Properties (
ID int IDENTITY (1, 1) NOT NULL ,
A float NOT NULL ,
B float NOT NULL ,
CONSTRAINT С_Properties UNIQUE NONCLUSTERED ( ID ) ON PRIMARY
) ON [PRIMARY]

Таблицы связаны между собой через Link таким образом, что каждый Контейнер содержит произвольное количество объектов. Атрибуты объектов могут меняться от контейнера к контейнеру (что для данной задачи не имеет никакого значения),
важно что Aтрибуты связаны с Объектами один к одному и оригинальные их значения связаны ссылкой где ContainerID=NULL.
Объект может попасть в Контейнер если его аттрибуты удовлетворяют условиям:
HiA >= A >= LoA AND HiB >= B >= LoB (*)

А теперь сама задача:
Для всех объектов из Контейнера X где X.Rank = N
найти все пары Объект-Контейнер для которых справедливы следующие условия:
1. Ранг контейнера не больше N (ранга исходного контейнера)
2. Объект удовлетворяет условиям (*) для данного контейнера но ему не принадлежит

Кому не лень, поделитесь соображениями насчет решения.
Курсоры не предлагать :))
...
Рейтинг: 0 / 0
16.08.2002, 11:26:37
    #32043824
alk
alk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестный поиск по 4 таблицам
не все понятно....

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

на человеческом языке эта задачка звучит как?

какая коробка из отсутствующих в Ж/Д контейнере подойдет по размерам в контейтер?

или

какая коробка из отсутствующих в Ж/Д контейнере подойдет по размерам в контейтер с учетом его загруженности другими коробками?
...
Рейтинг: 0 / 0
16.08.2002, 13:06:19
    #32043875
Nickolay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестный поиск по 4 таблицам
2alk: как я уже писал выше:
"Атрибуты объектов могут меняться от контейнера к контейнеру (что для данной задачи не имеет никакого значения)" поэтому-то и надо в линке хранить еще один набор атрибутов. А на человеческом языке это будет скорее так: какие вагоны из данного состава (Rank) еще не доукомплектованы (с учетом размеров коробки и места в вагоне)... :)
...
Рейтинг: 0 / 0
16.08.2002, 14:16:58
    #32043904
Владимир Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестный поиск по 4 таблицам
Я предпочёл бы изменить схему данных.
Эта мне представляется нелогичной, и отсюда трудности при работе с ней.
...
Рейтинг: 0 / 0
16.08.2002, 14:21:20
    #32043907
alk
alk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестный поиск по 4 таблицам
не совсем понял логику с rank.
но если я правильно понял задачу то получилось вот что

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ALTER PROCEDURE dbo.[proc]
@rank int , @contid int
AS SELECT     dbo.Object.ID
FROM         dbo.Link INNER JOIN
                      dbo.Object ON dbo.Link.ObjectID = dbo.Object.ID INNER JOIN
                      dbo.Properties p ON dbo.Link.PropID = P.ID INNER JOIN
                      dbo.Container ON dbo.Link.ContainerID = dbo.Container.ID
WHERE     (NOT (dbo.Object.ID IN
                          (SELECT     objectid
                            FROM          link
                            WHERE      containerid = @contid ))) and  (P.A >= LoA AND P.A <= HiA  AND P.B >= LoB AND   B <= HiB) and rank = @rank
...
Рейтинг: 0 / 0
16.08.2002, 15:20:32
    #32043943
Nickolay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестный поиск по 4 таблицам
2 Владимир: интересно какую структуру можете предложиь Вы?

2 alk не совсем то что нужно. Во первых нужна таблица типа: ObjectID, ContainerID которая содержит объект не попадающий в данный контейнер (тоесть такой Link отсутствует), а у Вас:

SELECT ... FROM dbo.Link
INNER JOIN dbo.Container ON dbo.Link.ContainerID = dbo.Container.ID

то есть заведомо выборка идет по существующим линкам. Ну естественно и вторая часть не верна...
Я понимаю, что задача нетривиальная, я сам ее до конца осознал, только после того как попытался ее объяснить на форуме :)
Я тут набросал один вариант, проверю и выложу на всеобщее обозрение.
А пока большое всем спасибо за участие
...
Рейтинг: 0 / 0
16.08.2002, 15:39:27
    #32043955
alk
alk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестный поиск по 4 таблицам
данные "изнечего" выбирать нельзя
соответственно данные такие как изначальные свойства объекта должны быть известны то есть к container хорошо бы добавить поле связи с параметрами по умолчанию, тогда объекты, не связанные с контейнером можно будет тоже выбрать
...
Рейтинг: 0 / 0
16.08.2002, 16:05:36
    #32043965
Nickolay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестный поиск по 4 таблицам
2 alk:
>данные "изнечего" выбирать нельзя
>соответственно данные такие как изначальные свойства
>объекта должны быть известны то есть к container хорошо
>бы добавить поле связи с параметрами по умолчанию,
>тогда объекты, не связанные с контейнером можно будет
>тоже выбрать

В том-то и суть задачи, чтобы сгенерировать недостающие линки в соответсвии с определенными правилами - тоесть данных которые нам нужны в чистом виде в базе и нет...
А вот оригинальные свойства объектов есть и привязаны они естественно к объектам-же.

А вот примерно то, что у меня получилось (примерно, это потому, что я естественно в примере выкинул все несущественные поля из реальных таблиц):

SELECT M1.* , D1.ID, D1.Rank FROM (
SELECT L.ObjectID, M.A , M.B FROM Link L
INNER JOIN Properties M ON M.ID = L.PropID
WHERE ContainerID IS NULL AND
ObjectID IN (
SELECT ObjectID From Link
WHERE ContainerID = (
SELECT ContainerID FROM .... ))) M1
INNER JOIN Container D1 ON
M1.A BETWEEN D1.MinA AND D1.MAxA
AND M1.B BETWEEN D1.MinB AND D1.MaxB
WHERE D1.Rank <= (
SELECT Rank FROM Container WHERE ContainerID = (
SELECT ContainerID FROM .... )) AND
NOT EXISTS (SELECT * FROM Link WHERE ObjectID = M1.ObjectID AND ContainerID = D1.ID)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Перекрестный поиск по 4 таблицам / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]