Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставить новую строку в середину таблицы, нижние строки сдвинуть ниже 
:(
    Опции темы
LexRema
  Дата 7.8.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



Есть таблица:

ааа 
bbb
ccc
ddd
fff
ggg

Например на третью позицию  нужно вставить новую строку zzz.

Как бы это покрасивее сделать?  smile Никаких айдишников и т.п. вспомогательных полей нет.

Спасибо. 
PM   Вверх
boevik
Дата 7.8.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 15
Всего: 35



Нет такого понятия середина таблицы.


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Akina
Дата 7.8.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Понятие порядка записей существует только после того, как указана сортировка. Если она не указана - порядок следования записей в результирующем наборе не определен. Впрочем, при этом большинство СУБД обычно (но не всегда) выдает записи в порядке их следования в кластерном индексе.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
LexRema
Дата 8.8.2007, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



Тоесть, такое не возможно? Жаль :(. Но в принципе, есть же стандартная схема отображения. Тоесть, ты внес данные в некотором порядке, при Селекте без указания сортировки они и будут выведены в таком порядке. Предполагаю, что это благодаря тому же кластерному индексу, о котором упоминал Akina

Но тогда почему не использовать вариант дополнительной темп. таблицы. Скажем, взять SELECT TOP 2... и вставить во вторую таблицу, потом вставить новую строку... Хм, а как вставить остаток? Да и не перепутаються ли у меня таким образом данные?
PM   Вверх
LuMee
Дата 8.8.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 30.3.2007

Репутация: нет
Всего: 1



LexRema, если не секрет - а зачем такое надо вообще?
PM MAIL   Вверх
LexRema
Дата 8.8.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



Хм smile. Есть одна база. Когда-то ее делали очень быстро... Но на данный момент она работает именно так. 
Это будет переделано, но не сейчас. Я только пришел на этот проект. 
И кому захочеться вручную удалят нижнюю часть, потом добавлять строку, потом добавлять нижнюю часть smile

Это сообщение отредактировал(а) LexRema - 8.8.2007, 12:58
PM   Вверх
boevik
Дата 8.8.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 15
Всего: 35



так и не над ничего удалять.
Надо установить order при селекте.
Т.е. выделить поле по которому будет производиться сортировка и новую запись вставлять с таким значением, что в селекте попадет в середине таблицы.

Селект без ордер может выполниться по кластерному индексу, или по порядку pages или ещё каким либо образом это как вздумается MSSQLу.


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
LexRema
Дата 8.8.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



Цитата(boevik @ 8.8.2007,  12:58)
Т.е. выделить поле по которому будет производиться сортировка и новую запись вставлять с таким значением, что в селекте попадет в середине таблицы.

Сори, не понял... 
PM   Вверх
LexRema
Дата 8.8.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



Вывод : Нужны дополнительные поля. Без них - невозможно.

Добавляю поле ОРДЕР

aaa 1
bbb 2
ccc 3
ddd 4

Вставляю на 3 позицию sss. Как изменить ордер в последующих строках?

Наведите код, плз.
PM   Вверх
boevik
Дата 8.8.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 15
Всего: 35



К примеру так:
Код

drop table table11
go
create table table11 (
f1 varchar(50),
orderField  varchar(50))
go
insert into table11
select 'aaa', '1'
union
select 'bbb', '2'
union
select 'ccc', '3'
union
select 'ddd', '4'

go
select * from table11 order by orderField
go 
insert into table11
select 'sss', '21'
go
select * from table11 order by orderField



Это сообщение отредактировал(а) boevik - 8.8.2007, 16:51


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
LexRema
Дата 8.8.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



Cool!!! smile 
Trick!!!! 

Но не пойдет :(. Ордер - интежер, и он должен быть последовательным :(.
PM   Вверх
Anark1
Дата 8.8.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: нет
Всего: 11



Цитата(LexRema @ 8.8.2007,  17:18)
Cool!!! smile 
Trick!!!! 

Но не пойдет :(. Ордер - интежер, и он должен быть последовательным :(.

В чем проблема? автоинкремент. Или триггер.


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
LexRema
Дата 8.8.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



каким образом?
PM   Вверх
Akina
Дата 8.8.2007, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Цитата(LexRema @  8.8.2007,  18:18 Найти цитируемый пост)
Ордер - интежер, и он должен быть последовательным 

C какого перепугу ПОСЛЕДОВАТЕЛЬНЫМ???

Что 1-2-3-4, что 15-123-7563-952364 - порядок вывода при order by получится одинаковым.

А вообще для того, что ТЕБЕ надо (хотя я до сих пор так и не понял, за каким собсно), придется организовывать хранение связного списка (т.е. добавить поле - либо PreviousID, либо NextID, либо оба поля). Тогда вывод осуществляется на основе связности, а вставка записи в середину требует (кроме вставки новой записи) дополнительно корректировки предыдущей и/или последующей записей.

Правда, у MS SQL нет встроенных средств работы со списками, и все придется организовывать вручную. Если не ошибаюсь, такие средства есть у Оракла.

Цитата(LexRema @  8.8.2007,  17:15 Найти цитируемый пост)
Вставляю на 3 позицию sss. Как изменить ордер в последующих строках?

Надеюсь, ты уже понял, что вставляешь ты в таблицу, а вот в какое именно место таблицы СУБД положит данные - определяется кластерным индексом, а при его отсутствии - его величеством Рандомом. Но в любом случае тебе фиолетово, где данные ЛЕЖАТ - тебя волновать должно где они будут ВЫВЕДЕНЫ на экран или при печати, а это от хранения не зависит, поскольку определяется получением и обработкой.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
LexRema
Дата 8.8.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



Цитата

C какого перепугу ПОСЛЕДОВАТЕЛЬНЫМ???

Что 1-2-3-4, что 15-123-7563-952364 - порядок вывода при order by получится одинаковым.


smile Да, мне порядок действительно фиолетовый. Но правда также в том, что есть уже некотарая нумерация, которая ведеться не строковыми, а инт значениями. и между 20 и 21 не вставить 201 smile.

Таблицу переделывать - нельзя, только можно придумать отдельное средство, которое будет руководствоваться токо этими данными.... Вот в чем горькая правда. Мне просто не нравиться решение, которое делалось раньше :

Код

--удаление нижней части
delete  tbl_items_box  where  [order] = 9
delete  tbl_items_box  where  [order] = 10 
delete  tbl_items_box  where  [order] = 11 
delete  tbl_items_box  where  [order] = 12 
delete  tbl_items_box  where  [order] = 13 
delete  tbl_items_box  where  [order] = 14 
delete  tbl_items_box  where  [order] = 15 
delete  tbl_items_box  where  [order] = 16 
delete  tbl_items_box  where  [order] = 17   
go

--добавление нового элемента
insert into tbl_items_box(id_item,[order]) values(381,9)
go

--вставка прежде удаленных строк
insert into tbl_items_box(id_item,[order]) values(61,10)
go

insert into tbl_items_box(id_item,[order]) values(71,11)
go

insert into tbl_items_box(id_item,[order]) values(51,12)
go

insert into tbl_items_box(id_item,[order]) values(101,13)
go

insert into tbl_items_box(id_item,[order]) values(191,14)
go

insert into tbl_items_box(id_item,[order]) values(41,15)
go

insert into tbl_items_box(id_item,[order]) values(311,16)
go

insert into tbl_items_box(id_item,[order]) values(111,17)
go

insert into tbl_items_box(id_item,[order]) values(301,18)
go


изврат? smilesmile
Будет переделано, но сейчас пока только так...

Цитата

Вставляю на 3 позицию sss. Как изменить ордер в последующих строках?

Надеюсь, ты уже понял, что вставляешь ты в таблицу, а вот в какое именно место таблицы СУБД положит данные - определяется кластерным индексом, а при его отсутствии - его величеством Рандомом. Но в любом случае тебе фиолетово, где данные ЛЕЖАТ - тебя волновать должно где они будут ВЫВЕДЕНЫ на экран или при печати, а это от хранения не зависит, поскольку определяется получением и обработкой.


Да, спасибо, это я понял.  Перефразирую задачу - мне фиолетово, на какую позицию вставиться новая строка. Главное, чтоб она вставилась с нужным ордером, а ордера других строк, где [ордер]>=@ордер_новой_строки  - инкрементировались на один.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1105 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.