Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2014, 11:02   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Запрос и оператор WITH

Код:
		With Subs_activ30_days (MSISDN, ID, SubsType)
		AS
		(
					SELECT										
							SUS.[MSISDN],
							SUS.ID,									  
							'OLD' as SubsType
						FROM [Subscriptions] SUS							
						WHERE	@TodayDate > '2014-03-07 00:00:00.000'	
							AND (DATEDIFF(day, @TodayDate, '2014-03-07 00:00:00.000')%30 = 0)
							AND	[State] = 1										
							AND DATEADD(dd, 0, DATEDIFF(dd, 0,SUS.[DateRegistered])) < '2014-03-07 00:00:00.000'
							AND MSISDN <> ''							
			UNION ALL			
					SELECT  										
							SUS.[MSISDN],
							SUS.ID,
							'NEW' as SubsType
						FROM [Subscriptions] SUS						
						WHERE @DateDiff30 >= DATEADD(dd, 0, DATEDIFF(dd, 0, SUS.[DateRegistered])) AND (DATEDIFF(day, @TodayDate, DATEADD(dd, 0, DATEDIFF(dd, 0, SUS.[DateRegistered]))) % 30 = 0)
							AND	[State] = 1
							AND	DATEADD(dd, 0, DATEDIFF(dd, 0,SUS.[DateRegistered])) >= '2014-03-07 00:00:00.000'															
		)
		UPDATE [Subscriptions]
		SET [DateStopped] = GETDATE(), [State] = 2 , AutoStop = temp_.ServiceNmbr
		FROM
		(		
				SELECT ISNULL(ss_.MAXM, 0) + ROW_NUMBER() over (PARTITION BY sad.MSISDN order by sad.MSISDN) as ServiceNmbr, ID
				FROM Subs_activ30_days sad
					LEFT JOIN ( -- Находим ранее записанные MAX AutoStop, и плюсуем к RowNumber(получаем увеличивающийся не повторяющийся AutoStop)
								SELECT MAX(AutoStop) as MAXM, MSISDN 
								FROM [Subscriptions] 
								WHERE AutoStop > 0 AND [State] = 2
								GROUP BY MSISDN
						 ) ss_ on ss_.MSISDN = sad.MSISDN
		) temp_
		WHERE [Subscriptions].ID=temp_.ID
Ребят, первый раз в глаза вижу оператор WITH..
Вообщем объясните пожалуйста тупарю, как он работает, то есть если я правильно понял выполняется сначала заполнение таблицы Subs_activ30_days, после чего выполняется UPDATE но в зависимости от того что написано в FROM, так оно?
coNsept вне форума Ответить с цитированием
Старый 11.12.2014, 14:38   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Можно не отвечать, понял что UPDATE-SET-FROM это единая запись и выполняется сразу же после WITH.
coNsept вне форума Ответить с цитированием
Старый 11.12.2014, 14:53   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно так интерпретировать - WITH формирует временную таблицу и инструкция после обращается к ней как к обычной таблице
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.12.2014, 16:14   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Цитата:
Можно так интерпретировать - WITH формирует временную таблицу и инструкция после обращается к ней как к обычной таблице
Да, спасибо Аватар, именно так потом мой баштусик и с интерпретировал.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Условный оператор,оператор цикла и массив Klark73 Microsoft Office Excel 1 19.12.2011 17:09
Оператор выбора или условный оператор[Перенесено из JavaSE] merhaba1992 Помощь студентам 1 20.01.2011 17:06
Условный оператор. Оператор выбора. Pascal Сержuk Помощь студентам 4 17.11.2010 12:50
Вычислить используя, оператор цикла for и оператор безусловного пе Knubbe Помощь студентам 1 18.12.2009 10:24