简书链接:sqlserver技巧
文章字数:556,阅读全文大约需要2分钟

保留2位小数
1
2
3
4
5
6
7
8
9
10
```cast( (case xx when '' then '0' else str(xx) end)  as decimal(18, 5))```
解决为0 问题。


强制为空的显示
```(case isnull(c.res,'') when '' then '未核对' else c.res end) 核对```

选中一个语句可以单独执行指定语句。。

变量设置方便测试

DECLARE @aaa varchar(50)
set @aaa= ‘xxxx’
select 0 xxtable,* from xxx where myxx in(@aaa)

1
变量控制执行

DECLARE @EXECUPDATE int
set @EXECUPDATE=1
IF( @EXECUPDATE =1 )
select ‘执行更新’
BEGIN
update xxx set xxx=1

END

1
2
3
4
5

inner join 等于 ==用法, left join 显示左边 right join 显示右边有的左边则为空


多表查询

–先查询1列方便观看。
SELECT TOP 1 * FROM A
SELECT TOP 1 * FROM B
SELECT TOP 1 * FROM C order by RecDate
SELECT TOP 1 * FROM D

select top 100 *
from A inner join B
on A.PartNo=B.PartNo
inner join C c.MinPackMtNo=B.MinPackMtNo
inner join D ON c.OpType=d.OpTypewhere c.MinPackMtNo=’XXX’
order by C.RecDate desc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

抓取执行


此方法过于强大可以用于逆向软件工程
任何执行记录都会被抓到
![image.png](https://upload-images.jianshu.io/upload_images/2815884-7f5ed6a871d5e291.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

有时候和同事交流太累可以直接让实施跑起来我这边逆向分析也是不错的方法
多表查询 去重
如果是多列相同可以使用distinct 或者group by
其中group by所需要包含的字段在select中也要有。

在项目开发中实际上select的所有列代表所需要展示的列,通常也需要select 时间,如果时间列,不相同此时需要用其他手段去重。

如下图中 ,因为BBB表多条相同记录但是时间不一样,这时候根据id取出最大的,name为代表a b表都有的,而且在BBB表有多条重复的数据 ,

SELECT name,distinct STATIO ,c.RecDate
FROM AAAA s
left join BBBB c on s.REEL_NO = c.sn and c.res != ‘NG’
and ID IN(SELECT max(ID) FROM BBBB GROUP BY name)
where s.X= ‘{X}’ ORDER BY c.RecDate

1
2
3
4
5

2023-11-21 11:46:00
去重 多条成功记录,由于核对成功显示了时间多条记录时间必然不一样,就无法达到去重,所以取最新id
但是上面不加条件效率有问题
因此也加上条件

SELECT name,distinct STATIO ,c.RecDate
FROM AAAA s
left join BBBB c on s.REEL_NO = c.sn and c.res != ‘NG’
and ID IN(SELECT max(ID) FROM BBBB where s.X=’{X}’ GROUP BY name)
where s.X= ‘{X}’ ORDER BY c.RecDate