Несколько полей засунуть в один столбец?
От: Sergeem Израиль  
Дата: 25.02.04 15:14
Оценка:
Поясню на примере, что мне надобно сделать:
Есть такая таблица —

ID KEY1 KEY2 KEY3 NAME1
1  ka1  ka2  ka3  aaa
2  kb1       kb3  bbb


А мне нужно получить view такого вида —

KEY ID NAME1
ka1 1  aaa
ka2 1  aaa
ka3 1  aaa
kb1 2  bbb
kb3 2  bbb


Делаю так (бд Oracle):

create view myview as
  select key1 key, id, name1 from mytable where key1 is not null
  union
  select key2 key, id, name1 from mytable where key2 is not null
  union
  select key3 key, id, name1 from mytable where key3 is not null


Хотелось бы избавиться от union.
Существует ли более изящный способ?

Еще один вопрос — всегда ли union сортирует записи? То есть могу ли я быть уверенным, что строчки с одинаковым ID придут "вместе"?
Serge.

Hасколько проще была бы жизнь, если бы она была в исходниках.
Re: Несколько полей засунуть в один столбец?
От: skyline Россия  
Дата: 25.02.04 15:46
Оценка:
Здравствуйте, Sergeem, Вы писали:

Чем тебе не понравился union?
Очень часто слитие столбцов в один — следствие плохой нормализации дынных, может быть это у тебя и случилось
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Re[2]: Несколько полей засунуть в один столбец?
От: Sergeem Израиль  
Дата: 25.02.04 16:26
Оценка:
Здравствуйте, skyline, Вы писали:

S>Здравствуйте, Sergeem, Вы писали:


S>Чем тебе не понравился union?

Тем, что таблица читается несколько раз, и потом еще все сортируется.

S>Очень часто слитие столбцов в один — следствие плохой нормализации дынных, может быть это у тебя и случилось


Мне этот view нужен для того, чтобы засосать все данные в память
через
select key, id, name1 from myview.

в итоге получаем ассоциативный контейнер типа key -> name.
Отношение — несколько к одному.
Serge.

Hасколько проще была бы жизнь, если бы она была в исходниках.
Re[3]: Несколько полей засунуть в один столбец?
От: Аноним  
Дата: 25.02.04 16:40
Оценка:
Здравствуйте, Sergeem, Вы писали:

S>Тем, что таблица читается несколько раз, и потом еще все сортируется.

Только это не значит, что union будет работать медленно.

Я, например, надавно видел на одной таблице в MSSQL что union работает в несколько раз быстрее чем аналогичная конструкция с or.

И вообще, возможно узменение семантики для запроса для скорости- не лучший ход.
Я бы советовал тебе забить, если к твоей проге нет притензии в скорости.
Re: Несколько полей засунуть в один столбец?
От: VVP Россия 67524421
Дата: 25.02.04 16:41
Оценка: +1
Здравствуйте, Sergeem, Вы писали:

S>Есть такая таблица -

ХЪ
S>А мне нужно получить view такого вида —
ХЪ
S>Делаю так (бд Oracle):
ХЪ
Т.е. тебе нужно не просто засунуть три столбца в один, а еще и сформировать по три строчки на каждую запись. А это уже другая задача.

S>Хотелось бы избавиться от union.

Пожалуй не надо, если вся таблица залезает в buffer_pool, то три раза с диска она читаться не будет, будет просто три прохода по набранным буферам.
S>Существует ли более изящный способ?
Сходу придумать не получилось, вот в обратную сторону — пожалуйста, с использованием аналитических функций можно. Да и не существует пожалуй более изящного способа, разве только пересоздать таблицу под новую структуру.
S>Еще один вопрос — всегда ли union сортирует записи? То есть могу ли я быть уверенным, что строчки с одинаковым ID придут "вместе"?
Ну, с точки зрения здравого смысла, если не используется parallel execution, да еще начитавшись Кайта, можно сделать вывод, что данные придут упорядоченно. Но документация Oracle и стандарт SQL говорят с точностью до наоборот — никогда не закладывайся на то, что данные придут в определенном порядке, если ты не используешь ORDER BY.
Никогда не бойся браться делать то, что делать не умеешь. Помни, ковчег был построен любителем. Профессионалы построили Титаник...
Re[2]: Несколько полей засунуть в один столбец?
От: Sergeem Израиль  
Дата: 26.02.04 08:29
Оценка:
Здравствуйте, VVP, Вы писали:

VVP>Здравствуйте, Sergeem, Вы писали:


[]

S>>Хотелось бы избавиться от union.

VVP>Пожалуй не надо, если вся таблица залезает в buffer_pool, то три раза с диска она читаться не будет, будет просто три прохода по набранным буферам.

В том то и дело, что таблица на самом деле немаленькая — порядка 1 000 000 строк, и ключей разных там будет штук 10,
правда ненулевых ожидается около пяти. Реальной таблицы у меня сейчас нет. Вот я и хочу соломки подстелить.

[]

S>>Еще один вопрос — всегда ли union сортирует записи? То есть могу ли я быть уверенным, что строчки с одинаковым ID придут "вместе"?

VVP>Ну, с точки зрения здравого смысла, если не используется parallel execution, да еще начитавшись Кайта, можно сделать вывод, что данные придут упорядоченно. Но документация Oracle и стандарт SQL говорят с точностью до наоборот — никогда не закладывайся на то, что данные придут в определенном порядке, если ты не используешь ORDER BY.

Да, а как хотелось бы... другой стороны, если натравить order by на отсортированные данные, то вроде ничего
ужасного произойти не должно.
Serge.

Hасколько проще была бы жизнь, если бы она была в исходниках.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.