|
|
|
Перекрестный поиск по 4 таблицам
|
|||
|---|---|---|---|
|
#18+
Уважаемые гуру и эксперты 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. Объект удовлетворяет условиям (*) для данного контейнера но ему не принадлежит Кому не лень, поделитесь соображениями насчет решения. Курсоры не предлагать :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 17:29:44 |
|
||
|
Перекрестный поиск по 4 таблицам
|
|||
|---|---|---|---|
|
#18+
не все понятно.... если таблица линк содержит информацию о содержащихся в контейнерах объектах, то почему свойства объектов назначаются тут же, при размещении а не не заранее, ведь свойства объекта это фиксированный атрибут объекта на человеческом языке эта задачка звучит как? какая коробка из отсутствующих в Ж/Д контейнере подойдет по размерам в контейтер? или какая коробка из отсутствующих в Ж/Д контейнере подойдет по размерам в контейтер с учетом его загруженности другими коробками? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 11:26:37 |
|
||
|
Перекрестный поиск по 4 таблицам
|
|||
|---|---|---|---|
|
#18+
2alk: как я уже писал выше: "Атрибуты объектов могут меняться от контейнера к контейнеру (что для данной задачи не имеет никакого значения)" поэтому-то и надо в линке хранить еще один набор атрибутов. А на человеческом языке это будет скорее так: какие вагоны из данного состава (Rank) еще не доукомплектованы (с учетом размеров коробки и места в вагоне)... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 13:06:19 |
|
||
|
Перекрестный поиск по 4 таблицам
|
|||
|---|---|---|---|
|
#18+
Я предпочёл бы изменить схему данных. Эта мне представляется нелогичной, и отсюда трудности при работе с ней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 14:16:58 |
|
||
|
Перекрестный поиск по 4 таблицам
|
|||
|---|---|---|---|
|
#18+
не совсем понял логику с rank. но если я правильно понял задачу то получилось вот что Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 14:21:20 |
|
||
|
Перекрестный поиск по 4 таблицам
|
|||
|---|---|---|---|
|
#18+
2 Владимир: интересно какую структуру можете предложиь Вы? 2 alk не совсем то что нужно. Во первых нужна таблица типа: ObjectID, ContainerID которая содержит объект не попадающий в данный контейнер (тоесть такой Link отсутствует), а у Вас: SELECT ... FROM dbo.Link INNER JOIN dbo.Container ON dbo.Link.ContainerID = dbo.Container.ID то есть заведомо выборка идет по существующим линкам. Ну естественно и вторая часть не верна... Я понимаю, что задача нетривиальная, я сам ее до конца осознал, только после того как попытался ее объяснить на форуме :) Я тут набросал один вариант, проверю и выложу на всеобщее обозрение. А пока большое всем спасибо за участие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 15:20:32 |
|
||
|
Перекрестный поиск по 4 таблицам
|
|||
|---|---|---|---|
|
#18+
данные "изнечего" выбирать нельзя соответственно данные такие как изначальные свойства объекта должны быть известны то есть к container хорошо бы добавить поле связи с параметрами по умолчанию, тогда объекты, не связанные с контейнером можно будет тоже выбрать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 15:39:27 |
|
||
|
Перекрестный поиск по 4 таблицам
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 16:05:36 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32043907&tid=1821059]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 310ms |

| 0 / 0 |
