Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 WITH + UNION  [new]
Testor1
Member

Откуда:
Сообщений: 679
Всем привет!

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

Есть вопрос, что можно сделать на уровне запроса, чтобы в случае если query не вернул ни одно записи, то select вернул значения @id, @sdatetime, @edatetime

DECLARE @id VARCHAR(16) = 'HOJ20121LK' , 
		@sdatetime DATETIME = '2012-01-01', 
		@edatetime DATETIME = '2013-01-01';


WITH query(from_id, to_id, sdatetime, edatetime)
AS
(
	SELECT from_id, to_id, @sdatetime, change_id_datetime  
	FROM tb_id_change
	WHERE from_id = @id
	UNION ALL 
	SELECT B.from_id, b.to_id, a.edatetime, b.change_id_datetime
	FROM query a INNER JOIN tb_id_change b ON a.to_id = b.from_id AND a.edatetime < b.change_id_datetime   
	WHERE b.change_id_date <= @edatetime
	
)	

SELECT from_id, sdatetime, edatetime
FROM query
UNION 
SELECT to_id, edatetime, @edatetime
FROM query
WHERE edatetime = (SELECT TOP 1 edatetime FROM query ORDER BY edatetime DESC )

-- UNION 
SELECT @id, @sdatetime, @edatetime - если query пустой 
3 ноя 12, 13:04    [13417916]     Ответить | Цитировать Сообщить модератору
 Re: WITH + UNION  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
Testor1,

Используй not exists, а для первого union соответственно exists
3 ноя 12, 13:15    [13417925]     Ответить | Цитировать Сообщить модератору
 Re: WITH + UNION  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
Alexander Titkin,

Хрень написал про первый union, просто not exists
3 ноя 12, 13:16    [13417928]     Ответить | Цитировать Сообщить модератору
 Re: WITH + UNION  [new]
Testor1
Member

Откуда:
Сообщений: 679
Alexander Titkin
Alexander Titkin,

Хрень написал про первый union, просто not exists


так query пустой :) они ничего не вернет :)
3 ноя 12, 14:11    [13418035]     Ответить | Цитировать Сообщить модератору
 Re: WITH + UNION  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
DECLARE @id VARCHAR(16) = 'HOJ20121LK' , 
		@sdatetime DATETIME = '2012-01-01', 
		@edatetime DATETIME = '2013-01-01';


WITH query(from_id, to_id, sdatetime, edatetime)
AS
(
	SELECT from_id, to_id, @sdatetime, change_id_datetime  
	FROM tb_id_change
	WHERE from_id = @id
	UNION ALL 
	SELECT B.from_id, b.to_id, a.edatetime, b.change_id_datetime
	FROM query a INNER JOIN tb_id_change b ON a.to_id = b.from_id AND a.edatetime < b.change_id_datetime   
	WHERE b.change_id_date <= @edatetime
	
)	

SELECT from_id, sdatetime, edatetime
FROM query
UNION 
SELECT to_id, edatetime, @edatetime
FROM query
WHERE edatetime = (SELECT TOP 1 edatetime FROM query ORDER BY edatetime DESC )

UNION 
SELECT @id, @sdatetime, @edatetime where not exists(select * from query);
3 ноя 12, 14:15    [13418045]     Ответить | Цитировать Сообщить модератору
 Re: WITH + UNION  [new]
Testor1
Member

Откуда:
Сообщений: 679
invm
DECLARE @id VARCHAR(16) = 'HOJ20121LK' , 
		@sdatetime DATETIME = '2012-01-01', 
		@edatetime DATETIME = '2013-01-01';


WITH query(from_id, to_id, sdatetime, edatetime)
AS
(
	SELECT from_id, to_id, @sdatetime, change_id_datetime  
	FROM tb_id_change
	WHERE from_id = @id
	UNION ALL 
	SELECT B.from_id, b.to_id, a.edatetime, b.change_id_datetime
	FROM query a INNER JOIN tb_id_change b ON a.to_id = b.from_id AND a.edatetime < b.change_id_datetime   
	WHERE b.change_id_date <= @edatetime
	
)	

SELECT from_id, sdatetime, edatetime
FROM query
UNION 
SELECT to_id, edatetime, @edatetime
FROM query
WHERE edatetime = (SELECT TOP 1 edatetime FROM query ORDER BY edatetime DESC )

UNION 
SELECT @id, @sdatetime, @edatetime where not exists(select * from query);


Сработало. Спасибо. Не знал, что FROM можно не указывать
3 ноя 12, 14:18    [13418057]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить