Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Подскажите как решить подобную задачу с помощью sql / 11 сообщений из 11, страница 1 из 1
18.09.2007, 13:15
    #34807788
Подскажите как решить подобную задачу с помощью sql
Доброго всем времени суток!

У меня такая проблема:

Есть таблица одной сущности (клиентов(clients)), с полями id, ... и т.д.
Есть таблица свойств этой сущности, так называемые CLIENTS_CUSTOM_ATTRS, в которой каждой строке из CLIENTS соответствует несколько строк. Т.е. отношение один ко многим.

Пример для наглядности:
client_id=1


CLIENT_ID MNEMO VALUE_STRING VALUE_INTEGER VALUE_DATE VALUE_BOOLEAN
------------ ------------------------------------ --------------- ---------------- ---------------------- ----------------
1 ca.shipping_info.name test (null) (null) (null)
1 ca.sex M (null) (null) (null)
1 ca.birth_info.birth_date (null) (null) 10/16/1976 12:00:00 AM (null)
1 ca.birth_info.birth_place Milano (null) (null) (null)

Ну что-то в этом роде.

Как видите задача ещё осложняется тем что поля могут быть разных типов.

Задача у меня такая получить на выходе таблицу наподобии:

CLIENT_ID CLIENT_NAME CLIENT_SEX CLIENT_BIRTH_DATE CLIENT_BIRTH_PLACE

т.е. что бы значения строк в таблице стали именами столбцов.

Осложняется все тем, что по некоторым причинам, о них умолчу, эту задачу нужно решить на уровне БД. VIEW, хранимая процедура, не важно, главное что бы это было решено на уровне БД.

Помогите плиз. Если появятся какие нибудь идеи, пишите их как можно подробнее, потому как в sql я, человек не искущённый.

P.S
Мы используем db2 8
...
Рейтинг: 0 / 0
18.09.2007, 13:44
    #34807933
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как решить подобную задачу с помощью sql
Тому, кто так проектирует базы данных - выдернуть ноги и вставить в зад.
...
Рейтинг: 0 / 0
18.09.2007, 14:03
    #34808025
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как решить подобную задачу с помощью sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select CLIENT_ID, 
         max(case nmemo 
                  when  'ca.shipping_info.name' then   VALUE_STRING 
                  else ''
              end) as CLIENT_NAME,
         max(case nmemo 
                  when  'sa.sex' then   VALUE_STRING 
                  else ''
              end) as CLIENT_SEX,
         max(case nmemo 
                  when  'ca.birth_info.birth_date' then   VALUE_DATE
                  else '19000101'                                -- любая "маленькая" дата, которая никогда не встретится в данных 
              end) as CLIENT_BIRTH_DATE, 
         max(case nmemo 
                  when  'ca.birth_info.birth_place' then   VALUE_STRING 
                  else ''
              end) as CLIENT_BIRTH_PLACE
from clients
order by CLIENT_ID
При желании select можно формировать на основе тойже таблицы и выполнять его динамически. Тогда автоматом будут подхватываться новые атрибуты.
...
Рейтинг: 0 / 0
18.09.2007, 14:06
    #34808037
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как решить подобную задачу с помощью sql
10 уровень нормализации - вся база в одной таблице
...
Рейтинг: 0 / 0
18.09.2007, 14:08
    #34808046
RomanSavelyev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как решить подобную задачу с помощью sql
Решение в лоб (для всех СУБД)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 
ids.client_id, 
clinam.string_val as client_name, 
clisex.string_val as client_sex,
clidat.date_val as bith_dat -- (и так далее)
from (select distinct client_id from clients) as ids
--(далее, если возможно отсутствие значений - left outer join)
join clients clinam on ids.client_id=clinam.client_id and clinam.mnemo='ca.shipping_info.name'
join clients clisex on ids.client_id=clisex.client_id and clinam.mnemo='ca.sex'
join clients clidat on.... -- (и так далее, для всех полей)
Т.е. делаем distinct-выборку ID клиентов и для каждого ID в JOIN выбираем атрибут.
Делать VIEW, MQT, аль просто запрос - как пожлаете.
Идея понятна?

P.S. Идею прошлого оратора по поводу смены дислокации ног у проектировщика БД - полностью поддерживаю.
...
Рейтинг: 0 / 0
18.09.2007, 14:20
    #34808107
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как решить подобную задачу с помощью sql
golsaselect client_id
, max...
from clients
order by CLIENT_ID
1. group вместо order
2. В else везде лучше cast(null as <corresponding_data_type>)
...
Рейтинг: 0 / 0
18.09.2007, 15:03
    #34808295
Подскажите как решить подобную задачу с помощью sql
Большое спасибо за пример, вы мне очень помогли.

Но у меня возникла ещё одна проблема, у меня может быть такая ситуация что определенной строки например
'ca.contract_info.phone_number.nearest' вообще может не быть.
Это можно как нибудь предусмотреть в запросе, который напсал golsa ?
...
Рейтинг: 0 / 0
18.09.2007, 15:35
    #34808474
HELP ME!!!
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как решить подобную задачу с помощью sql
HELP ME!!!
...
Рейтинг: 0 / 0
18.09.2007, 15:39
    #34808497
Подскажите как решить подобную задачу с помощью sql
а все сорри, последний вопрос снимается
...
Рейтинг: 0 / 0
19.09.2007, 09:45
    #34810088
Подскажите как решить подобную задачу с помощью sql
Ещё один вопрос:
Как сделать теперь count общего кол-ва выводимых строк?
...
Рейтинг: 0 / 0
19.09.2007, 09:57
    #34810126
gals
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как решить подобную задачу с помощью sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select
  clients.id as client_id,
  (select VALUE_STRING from clientdata where 
      clientdata.MNEMO = 'ca.shipping_info.name' and 
      clientdata.client_id = clients.id) as CLIENT_NAME,
  ...
from clients
where clients.id=?

При большом количестве данных в таблице clientdata надо строить индекс по MNEMO+CLIENT_ID.
Желательно, сделать этот индекс кластерным. Правда, надо будет иногда запускать реорганизацию этого индекса, чтобы не снижалась эффективность кластерного индекса.
При этом, ключ по полю CLIENT_ID необходим, для прямого чтения данных по заданному клиенту.
Можно сделать MDC таблицу по полю MNEMO, тогда вам не прийдется заботится о проблемах кластерного индекса.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Подскажите как решить подобную задачу с помощью sql / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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