当前位置: 代码迷 >> Sql Server >> sql这两个步骤有什么区别
  详细解决方案

sql这两个步骤有什么区别

热度:20   发布时间:2016-04-24 10:43:54.0
sql这两个方法有什么区别

--创建表1
CREATE TABLE #tmp1
(
  wlbh VARCHAR(30),
  sl FLOAT,
  sssl VARCHAR(50)
)
INSERT INTO #tmp1
        ( wlbh, sl, sssl )
VALUES  ( 'B0027077800102',333,'' 
          )
          
INSERT INTO #tmp1
        ( wlbh, sl, sssl )
VALUES  ( 'D00012550AS01',444,'' 
          )
          
 INSERT INTO #tmp1
        ( wlbh, sl, sssl )
VALUES  ( 'D00071660AS27',555,'' 
          )
--创建表2
CREATE TABLE #tmp2
(
  wlbh VARCHAR(50),
  sssl FLOAT
)
INSERT INTO #tmp2
        ( wlbh, sssl )
VALUES  ( 'D00071660AS27','222' )

--方法1更新sssl的数量,null为0
UPDATE #tmp1 SET SSSL=COALESCE(b.sssl,'',0)
FROM #tmp1 a
LEFT JOIN #tmp2 b ON b.wlbh=a.WLBH

/*结果
B0027077800102 333 0
D00012550AS01 444 0
D00071660AS27 555 222
*/

--方法2
UPDATE #tmp1 SET sssl=COALESCE(b.sssl,'',0)
FROM #tmp1 a,#tmp2 b
WHERE a.wlbh=b.wlbh

/*结果
B0027077800102 333
D00012550AS01 444
D00071660AS27 555 222
*/

SELECT *FROM #tmp1

DROP TABLE #tmp1
DROP TABLE #tmp2



1中可以将null转为0,为什么2中不可以,不是null,也不是空,是什么东西?
这两个方法有什么区别吗
------解决方案--------------------
一个左联#tmp1出全数据即使在#tmp2没有匹配数据,另一个是内联#tmp1的数据必须在#tmp2里有对应数据,不然就不更新
------解决方案--------------------
你把update 那一行换成select *

看看出来的结果 就知道了
------解决方案--------------------
引用:
--方法1更新sssl的数量,null为0
UPDATE #tmp1 SET SSSL=COALESCE(b.sssl,'',0)
FROM #tmp1 a
LEFT JOIN #tmp2 b ON b.wlbh=a.WLBH

--方法2
UPDATE #tmp1 SET sssl=COALESCE(b.sssl,'',0)
FROM #tmp1 a,#tmp2 b
WHERE a.wlbh=b.wlbh

这两个方法有什么区别吗

方法1是left join, 方法2的写法相当于inner join.