Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 [mysql 2 mssql] Запрос с переменными  [new]
staseg
Guest
Привет!

Есть табличка с полями: id, value.

create table test (id int auto_increment,value int,key(id));
insert into test set value=1;
insert into test set value=2;
insert into test set value=5;
insert into test set value=42;                                                                       
insert into test set value=1;                                                                       
insert into test set value=11;

select * from test;
+----+-------+                                                                                               
| id | value |                                                                                               
+----+-------+                                                                                               
|  1 |     1 |                                                                                               
|  2 |     2 |                                                                                               
|  3 |     5 |                                                                                               
|  4 |    42 |                                                                                               
|  5 |     1 |                                                                                               
|  6 |    11 |
+----+-------+

Теперь в оригинале есть такой запрос, выводящий дополнительную колонку с содержимым value предудыщей записи.
SET @prev=0;
SELECT
  id
 ,@prev as prev
 ,@prev:=value as value
FROM test;
+----+------+-------+
| id | prev | value |
+----+------+-------+
|  1 |    0 |     1 |
|  2 |    1 |     2 |
|  3 |    2 |     5 |
|  4 |    5 |    42 |
|  5 |   42 |     1 |
|  6 |    1 |    11 |
+----+------+-------+

Пытаюсь перевести его в mssql. mssql вижу впервые в жизни, раньше слышал пару раз о его существовании. Пока получилось так:

DECLARE @prev int;
SET @prev=0;
SELECT
  id
 ,@prev
 ,@prev=value
FROM test;

И тут затык: присваивать переменным значения внутри SELECT-а вместе с обычной выборкой данных нельзя ("A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations."). Что делать?

автор
Microsoft SQL Server Management Studio 10.50.2500.0
Microsoft Data Access Components (MDAC) 6.0.6002.18005
Microsoft MSXML 3.0 6.0
Microsoft Internet Explorer 9.0.8112.16421
Microsoft .NET Framework 2.0.50727.4216
Operating System 6.0.6002
30 ноя 11, 15:32    [11684143]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
select
 t1.id,
 t2.value as prev,
 t1.value
from
 test t1 outer apply
 (select top (1) value from test where id < t1.id order by id desc) t2
 
30 ноя 11, 16:05    [11684504]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
staseg
Guest
Спасибо!
30 ноя 11, 16:26    [11684721]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
staseg
Guest
Рано благодарил. Запрос на табличке с ~150к записей встал колом на три минуты и не доработал. Местами предыдущее значение устанавливалось неправильно. Совсем неправильной, даже непонятно откуда брались такие числа.
30 ноя 11, 17:54    [11685445]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
Baddy
Member

Откуда: Харьков
Сообщений: 174
если в id дырок нет, то можно так
select t1.*, isnull(t2.value, 0)
from test t1 left join test t2 on t2.id = t1.id-1
30 ноя 11, 18:38    [11685621]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
staseg
Guest
>если в id дырок нет, то можно так

Дырки есть. Да и вообще лучше представить, что id нет, нужно просто получать значение из предыдущей строки выборки.
30 ноя 11, 18:55    [11685714]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
Baddy
Member

Откуда: Харьков
Сообщений: 174
staseg
>если в id дырок нет, то можно так

Дырки есть. Да и вообще лучше представить, что id нет, нужно просто получать значение из предыдущей строки выборки.

если id нет, то как вы эту предыдущую строку идентифицируете? тогда нужно будет принудительно строки нумеровать в порядке какойнить сортировки
30 ноя 11, 19:03    [11685749]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
staseg
Да и вообще лучше представить, что id нет, нужно просто получать значение из предыдущей строки выборки.
У вас есть ведро крышечек из под пива, покажите какая из них первая, а какая 42-я.

staseg
предыдущей строки выборки

DECLARE	@Table TABLE (
	 ID	Int IDENTITY PRIMARY KEY
	,Value	Int
)INSERT	@Table VALUES (1),(2),(5),(42),(1),(11)

;WITH X AS (
	SELECT	*, Row_Number()OVER(ORDER BY (SELECT NULL)) AS Number
	FROM	@Table
)	SELECT	C.*, P.Value
	FROM	          X C
		LEFT JOIN X P ON P.Number = C.Number - 1
Для 2012 в 2 раза проще.
30 ноя 11, 19:26    [11685838]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
staseg
Guest
>У вас есть ведро крышечек из под пива, покажите какая из них первая, а какая 42-я.

К чему эта клоунада? Выборка - это фиксированный двумерный набор данных, а не какое-нибудь невнятное множество аля бутылочные крышечки.

За запрос спасибо, завтра на работе буду смотреть. Вообще я как-то разочарован монстроузностью mssql-запросов...
30 ноя 11, 20:14    [11686007]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
FantomGood
Member

Откуда: Херсон
Сообщений: 340
[quot Mnior ]У вас есть ведро крышечек из под пива, покажите какая из них первая, а какая 42-я.[quot]
+ за ведро крышечек
staseg
К чему эта клоунада? Выборка - это фиксированный двумерный набор данных, а не какое-нибудь невнятное множество аля бутылочные крышечки.

MSSQL server -реляционная база данных, и слово отношение или множество там абсолютно внятное
1 дек 11, 01:58    [11687103]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
staseg
К чему эта клоунада? Выборка - это фиксированный двумерный набор данных, а не какое-нибудь невнятное множество аля бутылочные крышечки.
Неправильно. Выборка - это нефиксированный двумерный набор данных, строки могут выводиться в произвольном порядке, если вы не указываете порядок. Как-же иначе?
1 дек 11, 09:07    [11687391]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
проходящий.
Guest
staseg
>У вас есть ведро крышечек из под пива, покажите какая из них первая, а какая 42-я.

К чему эта клоунада?
Это Вы про себя?
Выборка - это фиксированный двумерный набор данных,
И давно он стал фиксированным? Доказательство в студию.
а не какое-нибудь невнятное множество аля бутылочные крышечки.
Вы очень сильно заблуждаетесь.

За запрос спасибо, завтра на работе буду смотреть. Вообще я как-то разочарован монстроузностью mssql-запросов...
Что нам и/или MS надо сделать в связи с этим? Убиться "ап стену"? Кинуться лаконизировать запросы?
1 дек 11, 09:12    [11687400]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
staseg
Вообще я как-то разочарован монстроузностью mssql-запросов...
Для 2012 же просто достаётся через LAG, без подзапроса.
1 дек 11, 12:39    [11688638]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
Вообще я как-то разочарован монстроузностью mssql-запросов...


У каждого свои недостатки. (с)
1 дек 11, 12:55    [11688786]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Главное забыл.
Не надо путать интерфейсные задачи с задачами хранения/изменения и отбора.

Последовательность отображения это чисто клиентская задача.
Данную решают на уровне DataSet (любого), XSLT (тем более для печати) ...

staseg, никому здравомыслящему не придёт это делать на сервере. Разве что для единичных случаев - на скорую руку.
1 дек 11, 13:03    [11688837]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
staseg
Guest
Хм, ок, с фиксированным набором я капельку лоханулся)

>Это Вы про себя?

Ну разумеется!

>Что нам и/или MS надо сделать в связи с этим? Убиться "ап стену"? Кинуться лаконизировать запросы?

Лично ты можешь убиться, бесполезный биоматериал, а остальным я благодарен за помощь.

>Для 2012 же просто достаётся через LAG, без подзапроса.

И это прекрасно, но у меня что-то постарее, 2008 вроде как. Я даже не знаю, как посмотреть, все что нашел, выложил внизу ОПа.

>Не надо путать интерфейсные задачи с задачами хранения/изменения и отбора.

Это часть более широкой задачи: вычисление суммы разностей между некоторыми (по определенному условию) соседними строками выборки (на этот раз точно соседними благодаря сортировке). В mysql это делалось очень просто, поэтому никакой необходимости переноса этого в клиентскую часть не было, но сейчас нужно перетащить все это на mssql, хочется сделать это малой кровью просто поменяв запросы. На работе сейчас приходтся заниматься несколькими вещами, как руки дойдут, сразу буду пробовать предыдущий вариант. Если будут возникать еще вопросы, буду постить сюда, чтоб не плодить тем и самому не запутаться в них.
1 дек 11, 14:44    [11689761]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
staseg
Если будут возникать еще вопросы, буду постить сюда, чтоб не плодить тем и самому не запутаться в них.

А вот лучше постить в отдельные темы! Тем более вы всегда можете найти свои темы через профиль. Собственно нужно зарегиться только лишь.
1 дек 11, 15:14    [11690071]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Mnior, есть некая компания, работающая 24х7х365. В некой форме отображается список сущностей в порядке "дата создания сущности" desc. Теперь у данной сущности появился новый атрибут -- приоритет. Необходимо изменить порядок отображения на "дата создания сущности" desc, "приоритет". Как, с учетом
Mnior
Последовательность отображения это чисто клиентская задача.
решить данную задачу, не останавливая работу компании?

staseg, для оптимизации запросов придумали индексы. В вашем случае подойдет кластерный по id.
1 дек 11, 15:23    [11690161]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Вот 10824205 вариант без JOIN.
Т.е. можно применить на любом сложном запросе, при минимуме ресурсов.

Вот обобщённая формула
;WITH Number AS (
	SELECT	*,Row_Number()OVER(ORDER BY <Order>) - 1 AS [Number]
	FROM	<Query>
)	SELECT	*
		,CASE	Number % 2
			WHEN 0 THEN Max(CASE Number % 2 WHEN 1 THEN <val> END)OVER(PARTITION BY (Number + 0)/2)
			WHEN 1 THEN Max(CASE Number % 2 WHEN 0 THEN <val> END)OVER(PARTITION BY (Number + 1)/2)
			END	AS ValNext
		,CASE	Number % 2
			WHEN 0 THEN Max(CASE Number % 2 WHEN 1 THEN <val> END)OVER(PARTITION BY (Number + 1)/2)
			WHEN 1 THEN Max(CASE Number % 2 WHEN 0 THEN <val> END)OVER(PARTITION BY (Number + 0)/2)
			END	AS ValPrevious
	FROM	Number
1 дек 11, 16:20    [11690698]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
invm
Как, решить данную задачу, не останавливая работу компании?
Сменить форму отображения, что и делается в любой нормальной компании. При том не останавливая работу и не мудохаясь делать ALTER на базе.

Вы хотите сказать, что вам не повезло и у вас логика клиента завязана на сервере баз данных? Поздравляю. Но это никак не отменяет моих слов ни на сколько.

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

Более того, я выступаю за то что вся система (язык библиотека, API ...) были так спроектированы, чтобы любое изварщение нельзя было сделать просто. Чтобы быдлокодерам было хотябы неудобно писать говно.
1 дек 11, 16:33    [11690828]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Mnior
Сменить форму отображения, что и делается в любой нормальной компании. При том не останавливая работу и не мудохаясь делать ALTER на базе.
Отлично. Ваш вариант, упрощенно:
1. Меняем форму отображения и вносим изменения в запросы, захардкоженные в клиенте (хотя новые столбцы там нафиг не уперлись, но иначе нельзя, ибо сортируем мы на клиенте).
2. Перекомпилим клиента и тестим его.
3. Деплоим клиента на рабочие места, доставляя пользователям различные неудобства, в зависимости от способа деплоя.
4. Подсчитываем потери и вычитаем их из ЗП архитектора системы.

Причем, на каждом этапе задействованы разные люди.
С Web-UI несколько проще, но его мы не рассматриваем.

В моем же случае, DBA просто изменяет клаузу order by в нужной хранимке. И все, потерь нету. Причем тут "alter на базе" я, честно говоря, не понял.
Mnior
Вы хотите сказать, что вам не повезло и у вас логика клиента завязана на сервере баз данных? Поздравляю. Но это никак не отменяет моих слов ни на сколько.
Вы правы, мне повезло -- у меня у клиента вообще нет логики, он туп как пробка и занимается только отображением данных.

Mnior
Более того, я выступаю за то что вся система (язык библиотека, API ...) были так спроектированы, чтобы любое изварщение нельзя было сделать просто. Чтобы быдлокодерам было хотябы неудобно писать говно.
Утопия. Быдлокодерство выгодно всем, кроме конечного пользователя. Поэтому оно и поощряется всячески.
1 дек 11, 18:04    [11691597]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
Mnior
Последовательность отображения это чисто клиентская задача.

чушь, сортировка по умолчанию отображаемых данных - чисто серверная задача, согласен с invm
1 дек 11, 20:09    [11692358]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
invm
хотя новые столбцы там нафиг не уперлись
Вы потеряли нить разговора. Столбец PreviousValue явно добавляется для клиента.
invm
Деплоим клиента на рабочие места
Конечно, есть только один единственный правильный способ, ВАШ. И конечно это exe и конечно вручную. ... Ага.
invm
доставляя пользователям различные неудобства, в зависимости от способа деплоя.
Вот именно. Вы берёте свой маленький опыт и обобщаете.
invm
Подсчитываем потери и вычитаем их из ЗП архитектора системы.
Если пропустить и посмотреть в корень:
Ваша система вообще не предусматривает изменение ни клиента ни сервер-аппликейшина.
И:
invm
у меня у клиента вообще нет логики, он туп как пробка и занимается только отображением данных.
Ах нуда, интерфейс клиента этож просто, можно поменять что угодно и как угодно на сервере, но интерфейс на клиенте будет палюбе удобен и идеален, и сможет любое изменение проглотить. И при этом не иметь кода вообще.
Красивая сказка.

Вы приводите слишком частный случай. Где всё жёстко и тупо зпрограмячено в интрефейсе. У некоторый из-за этого новая колонка вызовет батхерд.

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

invm
В моем же случае, DBA просто изменяет клаузу order by в нужной хранимке. И все, потерь нету. Причем тут "alter на базе" я, честно говоря, не понял.
1. Конечно, изменение зранимки это же не ALTER (DDL)
2. Ну естественно, никаких блокировок от лимонов её вызовов у системы 7*24. Ага.
Может опыта мало?
Можно поменять кляузу сортировки на сервер-апликейшине и клиенте, никакой разницы нет.
Хотя на клиенте это не нужно ибо пользователь сам решает как сортировать, и как сортировать "по умолчанию" также. Проблема высосана из пальца.

Более того, вы там сидите своей же задницей на БД с прямым доступом, и думаете что поменять на ней полсекунды. А вот на остальном это мол геморно (т.е. лень). Вот я посморю как вы задеплоите на базе какой-нидь корпорации, к примеру Мицубиши. Изменить клиента бывает в 100 раз быстрее и проще, чем что-то серверное. Это не говоря про Аудит и т.п.

invm
Утопия.
Реальность. Если она вам не нравиться - не используйте MS SQL. Заюзайте оракл.
invm
Быдлокодерство выгодно всем, кроме конечного пользователя.
Афигеть. Обычно уволняют с позором. Поддержка кода и системы не реально с тавим подходом. Одноднеыне проекты для отмыва бабла?! И как зовут вашу волосатую лапу.
invm
Поэтому оно и поощряется всячески.
Да, уходом из проффесии.

ura
чушь, сортировка по умолчанию отображаемых данных - чисто серверная задача, согласен с invm
Вы не много не понимаете смысл форума. Тут не плюсики друг другу расставляют, а приводят аргументы. Так что ваш пост бессмысленен.
1 дек 11, 21:17    [11692590]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Mnior, вам была предложено решить задачу согласно вашему же утверждению
Mnior
Последовательность отображения это чисто клиентская задача.
И было приведено достаточно эффективное решение, которое противоречит этому вашему утверждению.
Вашего же решения я так и не увидел. Зато есть много словоблудия про мой скудный опыт работы, про неумение проектировать, про, почему-то, ручной деплой, про какие-то сервера приложений, о которых и речи не велось (наверное, вы себе не мыслите архитектуру системы без сервера приложений), про то как правильно проектировать интерфейсы, про мульены блокировок, мешающих альтерить процедуры (вот блин, а как же оно и работает и альтерится уже 12 лет?? да еще и развивается. не иначе как чудом), про то, что все мыслимые колонки в таблицах уже созданы на года вперед... и т.д. и т.п.
Ну и наконец про то, что мне пора сменить профессию. Хорошо, я подумаю над вашим предложением.

Если имеете смелость делать обобщения на весь мир, то приводите доказательства таких утверждений.

Засим, дискуссию с вами на эту тему считаю завершенной.
1 дек 11, 23:05    [11692939]     Ответить | Цитировать Сообщить модератору
 Re: [mysql 2 mssql] Запрос с переменными  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
invm, детский сад какой-то. Похоже на песочницу:
- Пришёл мальчик, а-а-а, построил пасочку выше моей, а-а-а, а я обиделся сломал ножкой все что есть, а-а-а, и сказал, что моя выше, и назвал я его плохим словом. А теперя я жалуюсь, маме, а-а-а, что он всё сломал и что это он меня обозвал. а-а-а.

invm, вы хотите чтобы я ответил на эти (11692939) вопиющие глупости, может всётаки вы пройдётесь по каждому важным аргументам и ответите. Не верю что нельзя ответить.

Если вы ошиблись в пару местах, зачем же всё сливать на эмоциях. Иногда я специально вставляю или чужие аргументы, или арнументы на которые у меня имеется контра, но они небыли озвучены. Так можно полноценно описать проблему и спровоцировать на разговор.
Мне хотелось, что бы проблемы были рассмотрены не только со своей колокольни. Вот поэтому это и подчёркивал. Зачем это воспринимать как личное оскорбление? Повторяю, форум не место личности. Поэтому вы должны понимать, что одного своего опыта мало, и то что у вас там оно там "работает" не аргумент. Проблема то в том, как эффективнее не у вас лично.
+ Почему это не контра, т.е. не аргумент
Утверждение: A ~> B

Берём случайную одну единственную выборку X, в которой А малая величина. Про B извесно лишь примерно, и на первый взгляд она не такая маленькая. Делаем предположение A ~< B, на не очень небольшую величину, но у каждого это по своему.

Можно ли сказать из этой выборки что всегда A ~< B? Нет же!

Утверждение A ~> B, не говорит что это правило железно и верно всегда. Оговаривается что оно массово верно.

При этом ещё говорится важное. Если не иметь всех необходимых точных приборов. Будет казаться что A и B < или > 50/50, или около того. Но если взять приборы (собрать опыт и знания всевозможных специалистов и не только), то увидим, казавшееся большим (сложным и трудоёмким), на самом деле очень просто, и всё выходит наоборот.

Поэтому своя колокольня тут не катит. Тут нужно слышать всех (на форуме и не только) много лет, хотеть смотреть на другие решения, постоянно подвергать своё сомнениям. Поэтому я и привожу реальные случаи (которые некоторые типа "не понимают").

Если вы побъёте мои арнументы, выиграют от этого те, кто так и думал. Ибо принесло плоды понимания.

invm, найдите время когда вы сможете беспристрасно оценить этот разговор с совершенно вам незнакомыми людьми invm и Mnior, по существу и без эмоций.
Может мне расписать список когда моё утверждение "не верно"? (Зря вы Web отбросили) Проблема то не в этом, а в том что я считаю что это исключения из правил, которые не отберут львиную долю случаев.
Может мне сделать выжимку из выше перечисленного, оставив только самые ценные аргументы? Надеясь на наше общее понимание сути.

Как вы думаете, сколько разговоров было слито на эмоциях в мире? В процентном соотношении. А мы то никуда и не спешим.

+ Выкушено самое ценное, но всё равно бесполезное
invm
Вашего же решения я так и не увидел.
На стороне клиента?
invm
И было приведено достаточно эффективное решение
Не достаточно. Выше было дополнено.
invm
которое противоречит этому вашему утверждению
В каком месте? Как?
2 дек 11, 11:41    [11694675]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить