Перейти к содержимому

Фотография

Помогите с запросом в MS SQL Server (е)создание запроса


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 28

#21
Napoleon

Napoleon
  • Свой человек
  • 669 сообщений

Понятное дело, для неизвестного количества записей.
Я не силен в MS SQL, точнее совсем профан, может он и позволяет написать такой запрос.
Например в Oracle можно извратиться и через ж написать иерархический запрос, который, впрочем будет медленнее, чем решение на основе функции, можно извратиться с помощью xml.
Но что-то мне не приходит в голову решение на основе ANSI SQL.


во во, и остается ... курсор :bored:
  • 0

#22
DuneWarrior

DuneWarrior
  • Свой человек
  • 907 сообщений


вы сами ответили на вопрос - для процесса да, для бизнеса нет.


Вообще-то я имел в ввиду "процесс" как часть "бизнеса", используещего ПО. Так что в данном случае веротна ситуация, когда одна поганая овца потртит всё стадо :bored:

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

И все таки мне было бы интересно узнать хороший алоритм работы для поворота на 90:
давайте представим:
Существует таблица "T" c колонками a,b,c...z в которой 1я колонка это название будущего столбца (например aa,bb..zz) , Кол-во записей меняется и тогда таблица конструируется заново.

давайте сделаем из нее таблицу с колонками aa,bb...zz


Решение готово, в деле разворота таблицы не используется ни один курсор или какие либо вариации на тему "while - begin - end " Скажу сразу решение доволльно "грязное" в смысле накладывает ряд ограничений на размерность полей входной таблицы, ну и довольно громоздко и не претендует на "хороший алгоритм". Однако поставленную задачу решает без курсоров, ибо они есть зло :spy: . Т.к., как я сказал, решение довольно громоздко, я не буду его тут публиковать. Желающие посмотреть подход могут писать на мыл AZhitnik{гав-гав}alseco.kz, я вышлю код.
  • 0

#23
DuneWarrior

DuneWarrior
  • Свой человек
  • 907 сообщений

Pooh, например, один из вырожденных случаев поворота - получить значения некоторого поля таблицы в одну строку(т.е из столбца получить строку).


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

#24
Need A Light

Need A Light
  • В доску свой
  • 1 760 сообщений
DuneWarrior, ну раз легко - так приведите его в студию. И не апдейт - селекта будет вполне достаточно))
  • 0

#25
Napoleon

Napoleon
  • Свой человек
  • 669 сообщений
2 DuneWarrior
Топег живет - это радует - но как быть в случае неизвестного кол-ва столбиков и строк?

выражение апдейта (set x1=y1 , x2 = y2) придется лепить под курсорчегом? это мы прошли уже.

переходя от малого к общему придем - что надо налепить кучу апдейтов под колво столбегов в исходной талбичке.
  • 0

#26
DuneWarrior

DuneWarrior
  • Свой человек
  • 907 сообщений

DuneWarrior, ну раз легко - так приведите его в студию. И не апдейт - селекта будет вполне достаточно))


declare @a varchar(1000)

update table
set @a = isnull(@a, '') + convert(varchar(10), a)

select @a

Table - исходная таблица, в которой есть поле "a" которое надо собрать в строчку. В примере поле "а" имеет разрядность равную 10. Переменная @a - результирующая строка.
Или мы про разное говорим?
  • 0

#27
DuneWarrior

DuneWarrior
  • Свой человек
  • 907 сообщений

2 DuneWarrior
Топег живет - это радует - но как быть в случае неизвестного кол-ва столбиков и строк?

выражение апдейта (set x1=y1 , x2 = y2) придется лепить под курсорчегом? это мы прошли уже.

переходя от малого к общему придем - что надо налепить кучу апдейтов под колво столбегов в исходной талбичке.


Неа, не надо ничего лепить, размер скрипта, с генерацией входной таблицы и комментариями - 177 строк. Я же в прошлом посте сказал. Смотрите на задачу с другой стороны. По поводу количества столбцов и строк - хаваетцо все без проблем. Если интересно, выше есть мое мыло. Пишите, и я вам отправлю решение, сам увидишь, что увеличение количества столбцов и строк не влияет на размер кода. Ессно надо не забывать об ограничениях накладываемых на такие задачи. Это во первых количество строк в исходной таблице не может быть больше 255, т.к. из них получается 255 столбцов, а это макиммум для скуля. Во-вторых, все поля входной таблицы, кроме первого, хранящего имена полей должны быть однотипны, т.к. однотипность данных должна быть сохранена в строках. Плюс одно орграничение моего решения, связанной с максимальной размерностью строкового типа и вопросы приведения, которые я не стал решать, дабы просто не усложнять, для понимания, код. В принципе всё.
  • 0

#28
Need A Light

Need A Light
  • В доску свой
  • 1 760 сообщений
DuneWarrior, да, похоже про разное.
я имел ввиду получение в одну строку всех значений одного поля.
  • 0

#29
Pooh

Pooh
  • В доску свой
  • 1 898 сообщений

Понятное дело, для неизвестного количества записей.

Прошу прощения, когда писал свой пост имел ввиду специальный случай с которым часто приходилось иметь дело. Есть таблица:

CREATE TABLE EXAMPLE_TABLE
(
PKEY VARCHAR2(25 BYTE),
LINE_NUM NUMBER(10),
DSCR VARCHAR2(50 BYTE)
);

ALTER TABLE EXAMPLE_TABLE ADD (
CONSTRAINT PK_EXAMPLE_TABLE
PRIMARY KEY
(PKEY, LINE_NUM)
);

В таблице поле LINE_NUM - счетчик, часть primary key, и заранее известно что все время начинается с 1 и увеличивается на 1 без пробелов. Нужно произвести "fixed length" ASCII файл в следущем формате:

RECORD_ID X(25)
RECORD_DSCR1 X(50)
RECORD_DSCR2 X(50)
RECORD_DSCR3 X(50)
RECORD_DSCR4 X(50)
RECORD_DSCR5 X(50)
RECORD_DSCR6 X(50)
RECORD_DSCR7 X(50)
RECORD_DSCR8 X(50)

Решалось таким образом:

SELECT ET1.PKEY,
ET1.dscr D1,
ET2.dscr D2,
ET3.dscr D3,
ET4.dscr D4,
ET5.dscr D5,
ET6.dscr D6,
ET7.dscr D7,
ET8.dscr D8
FROM EXAMPLE_TABLE ET1
left outer join EXAMPLE_TABLE ET2 on ET2.PKEY = ET1.PKEY and ET2.LINE_NUM = 2
left outer join EXAMPLE_TABLE ET3 on ET3.PKEY = ET1.PKEY and ET3.LINE_NUM = 3
left outer join EXAMPLE_TABLE ET4 on ET4.PKEY = ET1.PKEY and ET4.LINE_NUM = 4
left outer join EXAMPLE_TABLE ET5 on ET5.PKEY = ET1.PKEY and ET5.LINE_NUM = 5
left outer join EXAMPLE_TABLE ET6 on ET6.PKEY = ET1.PKEY and ET6.LINE_NUM = 6
left outer join EXAMPLE_TABLE ET7 on ET7.PKEY = ET1.PKEY and ET7.LINE_NUM = 7
left outer join EXAMPLE_TABLE ET8 on ET8.PKEY = ET1.PKEY and ET8.LINE_NUM = 8
WHERE ET1.LINE_NUM = 1

Естественно, количество полей выходящего файла заранее известно. Но в этом и суть моего первого поста в теме -- практика всегда отличается от теории. Napoleon так и не привел реального примера бизнес-требования которое решается поворотом таблицы на 90.
  • 0


Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.