powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Запросы в нормализованной базе -как?
9 сообщений из 9, страница 1 из 1
Запросы в нормализованной базе -как?
    #34171221
makondo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 3 таблички. В Оракле, но это несущественно.

1. TABLE C ( usrdb_ID NUMBER, ID NUMBER PK, name VARCHAR2, ... )
2. TABLE CP (usrdb_id NUMBER, id NUMBER PK, cp_type NUMBER, name VARCHAR2 )
3. TABLE CPV (usrdb_id NUMBER, id NUMBER PK, c_ID NUMBER, CP_ID NUMBER, valnum NUMBER, valchar VARCHAR2)

В С хранятся главные записи,
В CP список атрибутов для каждой usr_db
В CPV хранятся значения атрибутов для каждой записи. Если в CP у соответствующего CP_ID записан тип cp_type 1, то тип атрибута вещственный, если 2 - то текст. Соответственно, заполняется поле или valnum или varchar

Можно считать, что поля проиндексированы, и есть составные индексы по C(usrdb_id, ID)
...
Рейтинг: 0 / 0
Запросы в нормализованной базе -как?
    #34171253
makondo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Черт, Enter нажался сам. Недописал. Вот сообщение полностью

Есть 3 таблички. В Оракле, но это несущественно.

1. TABLE C ( usrdb_ID NUMBER, ID NUMBER PK, name VARCHAR2, ... )
2. TABLE CP (usrdb_id NUMBER, id NUMBER PK, cp_type NUMBER, name VARCHAR2 )
3. TABLE CPV (usrdb_id NUMBER, id NUMBER PK, c_ID NUMBER, CP_ID NUMBER, valnum NUMBER, valchar VARCHAR2)

В С хранятся главные записи,
В CP список атрибутов для каждой usr_db
В CPV хранятся значения атрибутов для каждой записи. Если в CP у соответствующего CP_ID записан тип cp_type 1, то тип атрибута вещственный, если 2 - то текст. Соответственно, заполняется поле или valnum или varchar

Можно считать, что поля проиндексированы, и есть составные индексы по C(usrdb_id, ID)

1 Вопрос. Как лучше всего втакой ситуации задавать запросы типа
SELECT C.*
FROM C , cpv
WHERE usrdb_id = :usrdb_id
and
c.id = cpv.id
AND
.... список условий на значение атрибутов
CP_ID = :CP_Id1 AND valnum = ....
AND
CP_ID = :CP_ID2 and valchar = .....
итд.



2 Вопрос.

Как сделать запрос такого же типа, но чтобы условия на значения атрибутов были сложные, типа

WHERE attribValue1 + attributValue2 <10

или
WHERE attribValue1 + attributValue2 = attribValue3


?
...
Рейтинг: 0 / 0
Запросы в нормализованной базе -как?
    #34171273
makondo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если вы знаете, как это сделать не в Оракле, а , например , в MSSQL, скажите плз, как на mssql-вском варианте такой запрос написать. Мне нужно понять сам принцип

На первый вопрос я бы использовал в оракле intersect , но как на второй вопрос ответить - не знаю..
...
Рейтинг: 0 / 0
Запросы в нормализованной базе -как?
    #34171361
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эпидемия однако...
Идея разворота EAV в плоскую таблицу -sum()/max()/min()... group by.
Для Oracle .
Если список атрибутов - переменная, то динамический запрос с той же идеей.
Также есть в FAQ.
...
Рейтинг: 0 / 0
Запросы в нормализованной базе -как?
    #34172031
makondo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ModelRЭпидемия однако...
Идея разворота EAV в плоскую таблицу -sum()/max()/min()... group by.
Для Oracle .
Если список атрибутов - переменная, то динамический запрос с той же идеей.
Также есть в FAQ.

Пример полезный, спору нет. Но мне для начала нужен не агрегирующий запрос, а просто список всех столбцов из С, у которых огрничения на атрибуты типа A1+A2 <A3
Или А1*A2 < 10
Хотя список атрибутов может быть разный, предположим для простоты, что их фиксированное количество, скажем десяток.

Как? :)
...
Рейтинг: 0 / 0
Запросы в нормализованной базе -как?
    #34172121
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Makondo
В примере показано, как строки превратить в столбцы. Дальше на эти столбцы можно накладывать любые условия, как при обычной структуре таблиц.
...
Рейтинг: 0 / 0
Запросы в нормализованной базе -как?
    #34172351
makondo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, не связал вторую таблицу с первой :)

Можете помочь? Связь C с CPV C.Id = CPV.C_ID
...
Рейтинг: 0 / 0
Запросы в нормализованной базе -как?
    #34172354
makondo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть, ничего нельзя сделать кроме вот что-то типа такого

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SELECT c.* 
FROM c,
( SELECT 
      (SELECT cpv.valnum v 
        FROM  cpv 
        WHERE  usrdb_id = :USRDB_UD 
          AND cpv.c_id = cpv.id
          AND cpv.cp_id =   :cp_id1   -- id первого атрибута 
       )  f1,
      (SELECT cpv.valnum v 
        FROM  cpv 
        WHERE  usrdb_id = :USRDB_UD 
          AND cpv.c_id = cpv.id
          AND cpv.cp_id =   :cp_id2   -- id 2го атрибута 
       )  f2,
      (SELECT cpv.valnum v 
        FROM  cpv 
        WHERE  usrdb_id = :USRDB_UD 
          AND cpv.c_id = cpv.id
          AND cpv.cp_id =   :cp_id3   -- id 3го атрибута 
       )  f3,
      ....   и так далее
   FROM dual
   WHERE f1 + f2 <f3
   
) ff 

WHERE c.usrdb_id - :usrdb_id
AND ...ограничения на поля с
AND 




У меня такое предчувствие, что он будет слегка тормозить... :)
...
Рейтинг: 0 / 0
Запросы в нормализованной базе -как?
    #34173710
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не,
ну как в FAQ, только в ваших терминах
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    SELECT cpv.c_id, 
         max (CASE cpv.cp_id when :cp_id1  THEN cpv.valnum ELSE NULL END) f1,   
         max (CASE cpv.cp_id when :cp_id2  THEN cpv.valnum ELSE NULL END) f2,   
         max (CASE cpv.cp_id when :cp_id3  THEN cpv.valnum ELSE NULL END) f3,   
      ....  
    FROM  cpv 
    WHERE  usrdb_id = :USRDB_UD 
    GROUP BY cpv.c_id
    HAVING max (CASE cpv.cp_id when :cp_id1  THEN cpv.valnum ELSE NULL END ) + 
           max (CASE cpv.cp_id when :cp_id2  THEN cpv.valnum ELSE NULL END)  <
           max (CASE cpv.cp_id when :cp_id3  THEN cpv.valnum ELSE NULL END)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Запросы в нормализованной базе -как?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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