Как получить эффект отсортированного представления базы данных? - PullRequest
3 голосов
/ 04 октября 2008

Я хотел бы иметь возможность (эффективно) сортировать представление базы данных - я знаю, что концептуально порядок в представлении БД недопустим, но у меня есть следующий сценарий:

  • стороннее унаследованное приложение, которое считывает данные из таблиц базы данных с помощью оператора select (*) из оператора namename
  • устаревшее приложение очень чувствительно к порядку записей
  • приложение, которое я написал, чтобы позволить пользователям более легко управлять данными в таблицах, но вставка и удаление из таблицы естественным образом нарушает порядок записей.

Изменение оператора в устаревшем приложении для выбора (*) из таблицы по порядку имен по полю решило бы мою проблему, но это не вариант.

Итак, я создал промежуточную таблицу, в которую можно экспортировать данные в правильном порядке, но это ресурсоемкий вариант, означающий, что данные не «живы» в унаследованном приложении и являются дополнительная работа для пользователей.

Я бы хотел иметь возможность получить заказанную версию стола с этими ограничениями. Есть идеи как?


Обновление - я работаю с Sybase 12.5, но я бы хотел избежать тесно связанного решения с конкретной СУБД - оно может измениться.

Я не могу добавить в представление предложение «упорядочить» из-за стандартов SQL, указанных в этой записи в Википедии

Ответы [ 6 ]

2 голосов
/ 04 октября 2008

Прежде всего, мне раньше приходилось работать над этим типом проектов, и это действительно сука. Мои соболезнования.

Это немного, но если ваша СУБД поддерживает это, возможно, вы могли бы создать пользовательскую табличную функцию, которая делает упорядоченный выбор из вашей прежней таблицы, а затем настроить свой вид для выбора из UDTF. Это не то, что я когда-либо делал прежде.

1 голос
/ 04 октября 2008

Вы можете попробовать табличную функцию. Вы не указали поставщика базы данных, но вот как вы это сделаете на TSQL (Sql Server):

CREATE FUNCTION orderedTable() 
RETURNS @returnTable TABLE 
    (val varchar(100)) AS
BEGIN
    insert @returnTable (val)
    select val from MyTable
    order by val desc
    RETURN 
END

GO

SELECT * FROM orderedTable
0 голосов
/ 06 октября 2008

Следуя информации, которую вы, ребята, предоставили, похоже, что я не могу делать то, что хочу в Sybase ASE 12.5.

MSSQL Server и Sybase ASE 15.x должны делать то, что нужно, - надеюсь, я смогу что-то организовать. Не совсем уверен, какой из них принять, пока у меня что-то получится, но я вернусь и приму ответ.

0 голосов
/ 04 октября 2008

В MS Sql Server мы можем убрать стандарты и создать представление, такое как:

SELECT TOP 100 PERCENT * FROM TABLE ORDER BY 1

, что позволяет нам обойти подобные проблемы. Поскольку Sybase и Sql Server совместно используют T-SQL, я думаю, у вас есть хороший шанс сделать это.

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

  • Это, правда, деталь реализации. Стандарты SQL (ни какой-либо конкретный поставщик, AFAIK) не гарантируют заказ без заказа по предложению ... но, эй, если бы вы могли это использовать, то вы бы не спрашивали.
0 голосов
/ 04 октября 2008

Если я правильно понимаю, вы можете решить это следующим образом:
1) Переименование исходной таблицы
2) Создание представления с именем таблицы, которую запрашивает устаревшее приложение.
3) Определите представление как запрос, который упорядочивает записи так, как ожидает устаревшее приложение.

0 голосов
/ 04 октября 2008

Это не хорошо, но работает

CREATE VIEW OrderedTable
AS SELECT TOP (Select Count(*) from UnorderedTable) *
FROM UnorderedTable Order By field
...