见鬼了,SQL错在哪里?

[复制链接]
查看11 | 回复7 | 2017-2-22 15:18:00 | 显示全部楼层 |阅读模式
DB:Sybase 15
Create Table #r2
(ym varchar(10) null,season varchar(10) null,_class varchar(20) null,sku int null,qty int null,qtysale int null,amt numeric(12,2) null,amttag numeric(12,2) null,discount numeric(12,2) null,
qtyall int null,qtyper int null,qtysaleper int null,amtper int null,skuprior int null,qtyprior int null,amtprior int null,nosprice numeric(12,2) null,qtysalepervs numeric(12,2) null,amtpervs numeric(12,2) null)
Insert #r2 (ym,season,_class,sku,qty,qtysale,amt,amttag,discount,qtyall,qtyper,qtysaleper,amtper,skuprior,qtyprior,amtprior,nosprice,qtysalepervs,amtpervs)
Select c.ym,c.season,c._class,c.sku,c.qty,c.qtysale,c.amt,c.amttag,round(c.amt/c.amttag,2) as discount,c.qtyall,c.qtyper,c.qtysaleper,c.amtper,

p.sku as skuprior,p.qty as qtysaleprior,p.amt as amtprior,n.nosprice,round((c.qtysale-p.qty)*100/(p.qty*1.0),2) as qtysalepervs,

round((c.amt-p.amt)*100/p.amt,2) as amtpervs
From #cur c left join#pr p on c.ym=p.ym and c.season=p.season and c._class=p._class
left join #sanos n on c.ym=n.ym and c.season=n.season and c._class=n._class
Select ym,season,_class,sku,qty,qtysale,amt,amttag,discount,qtyall,qtyper,qtysaleper,amtper,skuprior,qtyprior,amtprior,nosprice,qtysalepervs,amtpervs
From #r2 order by _class,ym,season desc
最后返回结果为空
但把 Insert #r2 这行注释掉,执行:
Select c.ym,c.season,c._class,c.sku,c.qty,c.qtysale,c.amt,c.amttag,round(c.amt/c.amttag,2) as discount,c.qtyall,c.qtyper,c.qtysaleper,c.amtper,

p.sku as skuprior,p.qty as qtysaleprior,p.amt as amtprior,n.nosprice,round((c.qtysale-p.qty)*100/(p.qty*1.0),2) as qtysalepervs,

round((c.amt-p.amt)*100/p.amt,2) as amtpervs
From #cur c left join#pr p on c.ym=p.ym and c.season=p.season and c._class=p._class
left join #sanos n on c.ym=n.ym and c.season=n.season and c._class=n._class
是有N行结果的(即使有一行p.amt为null值)。。。
Where's Bug ??

回复

使用道具 举报

千问 | 2017-2-22 15:18:00 | 显示全部楼层
也就是创建临时表,将查询结果插入临时表,再返回临时表,结果为空。。。
直接查询,有N行结果。。。
汗。。。
回复

使用道具 举报

千问 | 2017-2-22 15:18:00 | 显示全部楼层
检查临时表的on commit preserve rows设置
回复

使用道具 举报

千问 | 2017-2-22 15:18:00 | 显示全部楼层
感谢楼上朋友
暂未去测试,但根据语义,是说在Commit时保留临时表数据
但我在SP里,根本没有显式Begin Tran and Commit or Rollback
其他SP里也有类似的Create Table #tab,再Insert #tab,没有此现象

回复

使用道具 举报

千问 | 2017-2-22 15:18:00 | 显示全部楼层
itas还还需要在表名后面指定字段名么?insert后面建议加个into
回复

使用道具 举报

千问 | 2017-2-22 15:18:00 | 显示全部楼层
感谢楼上朋友建议,习惯了SQL SERVER语法,可省略INTO,Sybase也可省略,虽然INTO是ANSI标准
回复

使用道具 举报

千问 | 2017-2-22 15:18:00 | 显示全部楼层
Create Table #r2
(ym varchar(10) null,season varchar(10) null,_class varchar(20) null,sku int null,qty int null,qtysale int null,amt numeric(12,2) null,amttag numeric(12,2) null,discount numeric(12,2) null,
qtyall int null,qtyper int null,qtysaleper int null,amtper int null,skuprior int null,qtyprior int null,amtprior int null,nosprice numeric(12,2) null,qtysalepervs numeric(12,2) null,amtpervs numeric(12,2) null)

Select c.ym,c.season,c._class,c.sku,c.qty,c.qtysale,c.amt,c.amttag,round(c.amt/c.amttag,2) as discount,c.qtyall,c.qtyper,c.qtysaleper,c.amtper,

p.sku as skuprior,p.qty as qtysaleprior,p.amt as amtprior,n.nosprice,round((c.qtysale-p.qty)*100/(p.qty*1.0),2) as qtysalepervs,

round((c.amt-p.amt)*100/p.amt,2) as amtpervs
into #r2
From #cur c left join#pr p on c.ym=p.ym and c.season=p.season and c._class=p._class
left join #sanos n on c.ym=n.ym and c.season=n.season and c._class=n._class
回复

使用道具 举报

千问 | 2017-2-22 15:18:00 | 显示全部楼层
试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行