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асколько проще была бы жизнь, если бы она была в исходниках.
Здравствуйте, 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.
И вообще, возможно узменение семантики для запроса для скорости- не лучший ход.
Я бы советовал тебе забить, если к твоей проге нет притензии в скорости.
Здравствуйте, Sergeem, Вы писали:
S>Есть такая таблица -
ХЪ S>А мне нужно получить view такого вида —
ХЪ S>Делаю так (бд Oracle):
ХЪ
Т.е. тебе нужно не просто засунуть три столбца в один, а еще и сформировать по три строчки на каждую запись. А это уже другая задача.
S>Хотелось бы избавиться от union.
Пожалуй не надо, если вся таблица залезает в buffer_pool, то три раза с диска она читаться не будет, будет просто три прохода по набранным буферам. S>Существует ли более изящный способ?
Сходу придумать не получилось, вот в обратную сторону — пожалуйста, с использованием аналитических функций можно. Да и не существует пожалуй более изящного способа, разве только пересоздать таблицу под новую структуру. S>Еще один вопрос — всегда ли union сортирует записи? То есть могу ли я быть уверенным, что строчки с одинаковым ID придут "вместе"?
Ну, с точки зрения здравого смысла, если не используется parallel execution, да еще начитавшись Кайта, можно сделать вывод, что данные придут упорядоченно. Но документация Oracle и стандарт SQL говорят с точностью до наоборот — никогда не закладывайся на то, что данные придут в определенном порядке, если ты не используешь ORDER BY.
Никогда не бойся браться делать то, что делать не умеешь. Помни, ковчег был построен любителем. Профессионалы построили Титаник...
Здравствуйте, 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асколько проще была бы жизнь, если бы она была в исходниках.