Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Есть ли тип данных порядок?

Вот есть задача хранить порядок строк.
Чтобы можно было быстро и удобно менять их местами.
И если создать столбец order с типом integer, то при изменении значения order в какой то строке,
другие значения в столбце не пересчитываются.

Например есть таблица:
Строка Порядок
1 1
2 2
3 3
4 4

Дальше мы меняем в строке 3 порядок на 1.
И получается
Строка Порядок
1 1
2 2
3 1
4 4

А нужно пересчитать порядок остальных строк тоже
Строка Порядок
1 2
2 3
3 1
4 4

Как правильней это организовать? Можно ли это сделать без пересчёта всех остальных значений?
Ответ:
Alexander A. Sak
Я это решал апдейтом типа такого:
update Таблица t set
   t.Порядок = case when t.Порядок=3 then 1 else 3 end
where t.Порядок in (3, 1)
  and ЧТО_ТО_ЕЩЕ
В case нужно не обменивать, а устанавливать старое значение в новое. Остальные строки между least и greatest добавлять 1 или вычитать 1 в зависимости от отношения старое-новое значение.
Но вариант с делимым шагом предпочтительнее, так как требуется только выборка двух строк, между кем вставка, и апдейт одной строки.
Вопрос: Сохранение порядка столбцов в табличной форме

После компиляции в accde изменяю порядок столбцов в табличной форме. После перезапуска БД столбцы располагаются в прежнем порядке. В accdb порядок сохраняется.
Как можно сохранить порядок?
Ответ: Порядок столбцов в табличной форме определяется свойством ColumnOrder, относящимся к свойствам формы. В accde и mde сохранить форму не удастся, поэтому порядок столбцов надо хранить вне формы (таблица, проперть, файл, реестр). В примере предлагается хранение порядка номеров столбцов в специальной таблице ColumnOrders с полями NameForm, NameColumn, OrderColumn
На событии выгрузки формы в ColumnOrders записываются номера в текущем порядке, на загрузке они считываются и полям присваивается сохраненный ColumnOrder.

Даю вариант ACCDB, в "Е" версию конвертируйте сами
Вопрос: пятничный псто о порядке "событий" записей стейтмента

//в частности к знатокам лондайста.

-- есть ли какие-то гарантии того, в каком порядке обрабатываются [ и будут и далее] события записей внутри транзакции ?

вводная :
1. есть триггер записи событий, висит на after insert|update|delete каждой записи. генерит [, кроме записи txid_current()], еще и nextval в ev_id (как в pgq.event примерно)

-- идея банальная -- писать события, и обрабатывать в месте назначении в подходящем порядке [пока не уточняем, в каком].

теперь генерю тестовый батч "событий"
+
WITH del AS (DELETE FROM my_table v WHERE my_table_id BETWEEN 0 AND  100 RETURNING v.*)
INSERT INTO my_table SELECT * FROM del;

и вижу -- последними 100 за ev_id пришли обработки события удаления строки (СТЕ-стейтмента), а не вставки строк (того же СТЕ --стейтмента).


-- вот тут то и возникает вопрос, об опущенном выше "подходящем порядке".



PS Вспоминается -- у лондайста[3-го] триггера фиксации событий по умолчанию срабатывают в after [, но есть опция -- перенести триггер на событие before]. А порядок реплицирующих стейтментов внутри батча -- кажется только по ev_id [pgq.batch_event_sql()] . Как они выкручиваются, в свете вышесказанного? кто-нть разбирался ? Или там таки будет дырка ?
Ответ: qwwq,

Кстати, ты правильно отмечал, что здесь замешано partitioning.

До тех пор, пока была обычная таблица, after row триггера для with delete ... insert работали в ожидаемом порядке (Мишин пример).
Как только таблица стала секционированной - ситуация поменялась.
А что изменилось.
Изменилось, что delete добирается до искомой таблицы через наследование, а insert через триггер, разруливающий вставку в нужные секции.
Вот где-то в этом месте порядок и сломался.
Но, как я и писал ранее, его никто и не гарантировал.
Вопрос: порядок проставления identity значений при alter table add identity

Есть таблица с многими записями изначально без кластерного ключа. Потребовалось добавить identity unique clustered.

В каком порядке проставятся identity значения и можно ли повлиять на порядок?

В Profiler между SQL:StmtStarting/Completed для ALTER видно автоматическое
UPDATE [таблица] SET [поле identity] = DEFAULT
Если кластерный ключ:
  • 1) не задан, порядок проставления identity "произвольный",
  • 2) есть, то согласно ему.

    Описание такого поведения найти не удалось. Есть ли это в официальной документации?
    Если важен порядок, то единственный вариант- перезалить данные?

    Для sql 2005+
  • Ответ:
    Mind
    У вас что там какая-то бизнес логика завязана на несуществуещее, пока что, поле? Или вы собираетесь по IDENTITY полю определять какую строку вставили первой, а какую второй?
    Да, порядок вставки используется в бизнес-логике. Раньше это была нумерация 1,2,3 в пределах "мастер" поля. Теперь это IDENTITY в пределах таблицы.
    Вопрос: Хранение порядка строк в таблице

    Приветствую!

    Приложение клиент-сервер. Все на ХП. Delph/SQL Server 2008 R2, но не суть.

    Подскажите "правильное" решение вот такой задачи:
    Пользователь вводит операции (записи) в определенном порядке - ему этот порядок важен.
    Нужно уметь вставлять новую операцию (читай запись) внутрь, тасовать (драг-н-дроп) операции, удалять.
    Как правильно организовать структуру хранения?

    Пока варианта 3 в башку пришло:

    1. Хранить номер записи в отдельном поле. При вставке новой записи или перемещения - перенумеровывать весь набор данных.
    +Простота и понятность реализации.
    -Необходимость обновлять весь набор данных на клиенте после каждой вставки, удаления и перемещения.
    Частично проблему можно решить, если повторять операцию на клиенте, не обновляя весь набор.

    2. Связной список. Хранить поле, ссылающееся на предыдущий элемент.
    +Вставка, удаление затрагивает только две записи.
    -Чуть более сложный select (CTE). Если в БД ковыряться напрямую (такое бывает), то можно разорвать список.
    Защититься можно триггером.

    3. Сделать поле номера записи типа float. И при вставке находить среднее между вставляемыми записями и писать туда.
    +Естественный порядок сортировки сохраняется. Запрос уж через row_number(order by float_index).
    -Нельзя вставить очень много записей, т.к. разрешающая способность float ограничена. ну вставка 20 записей "расщепит" его до одной миллионной. Можно конечно, каждые 20 (или другое кол-во) вставок делать перенумерацию (как в старом добром бейсике).

    Но это все "мои велосипеды". Может есть нормальные, проверенные временем, решения, лишенные недостатков?
    Ответ:
    dymka
    3. Сделать поле номера записи типа float. И при вставке находить среднее между вставляемыми записями и писать туда.
    +Естественный порядок сортировки сохраняется. Запрос уж через row_number(order by float_index).
    -Нельзя вставить очень много записей, т.к. разрешающая способность float ограничена. ну вставка 20 записей "расщепит" его до одной миллионной. Можно конечно, каждые 20 (или другое кол-во) вставок делать перенумерацию (как в старом добром бейсике).

    Есть еще вариант этого пункта - под позицию отводится два целых поля. И потом рассматриваются как натуральная дробь.

    Если же хочется совсем оптимально делать, то нужно начинать по ключевым словам Self-balancing binary search tree.
    Упорядоченный список - это листья такого дерева. Но встанет вопрос 'А оно точно надо?'
    Вопрос: Как вставить записи в том же порядке?

    Есть функция, которая разбирает что-то и возвращает четыре строки, всегда в том же порядке.
    Для простоты - пример:
    CREATE FUNCTION [dbo].[splitstring]()
       RETURNS @t TABLE (nstr nvarchar(128)) AS
       BEGIN
          INSERT @t (nstr)  VALUES(N'vasya')
    	  INSERT @t (nstr)  VALUES(N'vasin host')
    	  INSERT @t (nstr)  VALUES(N'127.0.0.1')
    	  INSERT @t (nstr)  VALUES(N'::1')
          RETURN
       END
    GO
    
    select * from [dbo].[splitstring]()
    


    Как вставить выход этой функции в таблицу такого типа

    declare @target table(prop_name nvarchar(128),prop_value nvarchar(128))
    



    чтобы в результате было так, здесь имена проперти фиксированы изависят от порядка записи, выданной из функции

    select * from  @target
    
    prop_name prop_value
    ------------- --------
    user_name  vasya
    user_host    vasin host
    IPv4           127.0.0.1
    IPv6           ::1
    
    Ответ:
    Ролг Хупин
    Гавриленко Сергей Алексеевич
    пропущено...
    Пока вы не добавите в функцию поле, которое отвечает за порядок, то никак.


    Да, можно, но не могу влезать в функцию.
    Чтобы не тормозить, сделал так пока

    declare @target table(id int identity, prop_name nvarchar(128),prop_value nvarchar(128))
    insert into @target(prop_value) select nstr from [dbo].[splitstring]()
    
    Гарантии порядка при генерации identity все равно нет.
    Вопрос: MSSAS , BI студия и порядок мер в браузере

    В BI студии микросовтовской у куба поменял порядок следования мер сверху вниз,на тот что нужен.Процесснул куб, потом переконектился в окне Browser , но там в Fact Area меры сверху вниз следуют в алфавитном порядке.
    Можно ли где-то задать определенный порядок следования мер?
    Ответ: StarikNavy,

    Установленный флажок Binary (Двоичный) означает, что будет использоваться двоичный порядок сортировки вместо словарного (т. е. будут сравниваться числовые значения кодов символов). Флажок Case-sensitive, конечно, означает, будет ли учитываться регистр (как правило, это не требуется). Параметры Accent-sensitive, Kana-sensitive и Width-sensitive применяются только для дальневосточных языков.
    Вопрос: Каскадное удаление в определенном порядке

    Здравствуйте. Подскажите а как использовать каскадное удаление если очень много связанных таблиц и нужно удалять в определенном порядке?
    Ответ: Порядок удаления определяется исключительно деревом внешних ключей. Если же операция на одной таблице по причине наличия нескольких FK вызывает несколько каскадных операций на разных таблицах, то управлять порядком их выполнения невозможно - нет такого инструмента.
    Если же порядок выполнения способен как-то повлиять на данные (иначе нафига поставленный вопрос?) - то это веский аргумент за то, что структура БД и методика работы с данными требуют серьёзного пересмотра.
    Вопрос: порядок выборки из таблицы без Order by

    Есть запрос
    SELECT *
    FROM TRAUTH 
    WHERE DOCUMENTID = :DOCUMENTID
    


    Раньше он всегда выдавал записи в порядке первичного ключа.
    Да и сами записи также записывались строго подряд, и не изменялись.

    Потом, при определенных условиях, некоторые из записей стали обновляться некоторое время спустя
    И в выборку они стали попадать "вне порядка ПК"

    Я правильно понимаю, что это - естественный порядок вещей?
    Ответ:
    Cobalt747
    Раньше он всегда выдавал записи в порядке первичного ключа.


    это везение. Работоспособно только если записи никогда не обновляется/не удаляются.
    Если выборка идёт ровно из одной таблицы и по плану NATURAL, то в общем случае зависит от того как записи легли на страницах.
    Поэтому закладываться на такое нельзя.
    Вопрос: Как сделать нужный набор полей в нужном порядке

    Вообщем задача заключается в следующем.
    В ходе обработки БД необходимо чтобы на каждом из этапов обработки БД была возможность выбора определенный набор полей, а также чтобы они шли в определенном порядке.

    Например, обрабатывая адрес и приводя адресные сущности к справочным значениям, для удобства обработки, нужно чтобы поля шли в определнном порядке. Например, Индекс, Область, ОбластьID, Район, РайонID, Город, ГородID.

    На следующем этапе, обработки необходимо, чтобы поля шли Индекс, Область, Район, Город, ОбластьID, РайонID, ГородID.

    На следующем этапе, например, обработки необходимо, чтобы поля шли Область, ОбластьID, Район, Индекс, Город, РайонID, ГородID.

    Сейчас просто перетягиваю поля вручную, скрываю, те которые не нужно и т.п. Да это не занимает много времени, но за каждым разом далать одни и те же манипуляции с полями немного запарило.

    Кто подскажет, есть ли какая то надстройка, или подскажет как реализовать макросом вид отображаемой таблицы по заранее подготовленым шаблонам отображения.

    Заранее спасибо!
    Ответ: ТС, если честно, то не совсем понятно, чего вы хотите в итоге. Не думаю, что ваша конечная цель - это порядки полей.
    Но, КМК, здесь решение вашей проблемы