Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all articles
Browse latest Browse all 7251

SQLServer2000! Unexpected query result/bug(?): function/subquery/having

$
0
0
Привет,
получаю странный результат выборки на SQLServer 2000-8.00.2050. На SQLServer 2016 все работает как и ожидается, на других версиях нет возможности проверить.
Код:
    create function _tmp_test(@par int)
    returns char(1)
    as
    begin
    	return 'Z'
    end
    
    go
    
    if object_id('tempdb..#tmp1') is not null drop table #tmp1
    if object_id('tempdb..#tmp2') is not null drop table #tmp2
    
    create table #tmp1
    (
    	lineid		int			not null,
    	docid		char(9)			not null,
    	doctype		int			not null,
    	prop1_id	char(9)			not null,
    	value		int			not null
    
    	primary key(lineid)
    )
    
    create table #tmp2
    (
    	propid		char(9)		not null,
    	prop_1		char(1)		not null
    
    	primary key(propid)
    )
    
    
    insert into #tmp1 values(1,'A',1157,'prop_id1',39500)
    insert into #tmp1 values(2,'A',1157,'prop_id2',7500)
    
    insert into #tmp2 values('prop_id1','A')
    insert into #tmp2 values('prop_id2','B')
    
    
    select
    	prop1_id
    	,doc
    	,Sum(value) value
    from
    	(
    	select
    		prop1_id = tmp2.prop_1,
    		doc 	 = dbo._tmp_test(tmp1.doctype) +  tmp1.docid,
    		value 	 = tmp1.value
    	from
    		#tmp1 tmp1
    	left join
    		#tmp2 tmp2 on tmp2.propid = tmp1.prop1_id
    	)vt
    group by
    	prop1_id
    	,doc
    having
    	Sum(value)<>0
    
    go

    drop function _tmp_test


результат:
prop1_iddocvalue
AZA39500
BZA39500
AZA7500
BZA7500

картинка

Если убрать функцию или having, результат тот, что и ожидается. То есть:
    select
    	prop1_id
    	,doc
    	,Sum(value) value
    from
    	(
    	select
    		prop1_id = tmp2.prop_1,
    		doc 	 = dbo._tmp_test(tmp1.doctype) +  tmp1.docid,
    		value 	 = tmp1.value
    	from
    		#tmp1 tmp1
    	left join
    		#tmp2 tmp2 on tmp2.propid = tmp1.prop1_id
    	)vt
    group by
    	prop1_id
    	,doc

или
    select
    	prop1_id
    	,doc
    	,Sum(value) value
    from
    	(
    	select
    		prop1_id = tmp2.prop_1,
    		doc 	 = /*dbo._tmp_test(tmp1.doctype)*/ 'Z' +  tmp1.docid,
    		value 	 = tmp1.value
    	from
    		#tmp1 tmp1
    	left join
    		#tmp2 tmp2 on tmp2.propid = tmp1.prop1_id
    	)vt
    group by
    	prop1_id
    	,doc
    having
    	Sum(value)<>0

выдает то, что ожидается:
prop1_iddocvalue
AZA39500
BZA7500

В чем проблема с первым запросом, есть у кого-то идеи?

Viewing all articles
Browse latest Browse all 7251

Trending Articles