備忘錄--給自己

昨天,偶然發現的一個小知識點,以後也會把小知識點累積起來:

Declare @object_id int,

                @object_schema_name varchar(30)=object_schema_name(@object_id)

一直是有錯誤提示,原來在一個declare裏面,未被識別,分開decalre就好了

-- 就 逗號跟 join 的 區別 做了一點測試:


;WITH a AS
(
  SELECT 'a' AS col
   UNION all 
  SELECT 'a' AS col
   UNION all
  SELECT 'b' AS col
   UNION all
  SELECT 'c' AS col
   UNION all
  SELECT 'b' AS col
   UNION all
  SELECT 'd' AS col
   UNION all
  SELECT 'f' AS col
)


SELECT  a.col AS acol,b.col AS bcol FROM a a , a b  

--沒有加上 where 條件做篩選的時候應該是 笛卡爾積

WHERE a.col=b.col --加上 這個 篩選條件應該是 跟 inner join 等效。


Declare  @object_id int

Declare  @object_schema_name varchar(30)=object_schema_name(@object_id)

用來做測試表的,本不存在的表,個人覺得都是內存表,並不佔用硬盤容量:

兩種寫法:

第一種:

--類似於通用表表達式
;WITH cte (NAME)
AS
(
SELECT 'Tom'
UNION
SELECT 'Jim'
UNION
SELECT 'Anna'
)
SELECT * FROM cte

第二種:
--莫名的表,有人說是DB2的寫法,應該類似於ORACLE的dual表,說穿了是個子查詢,所以應該是內嵌視圖
SELECT * FROM
(VALUES
('Tom'),
('Jim'),
('Anna')
) a (Name)

如果要給某個字符賦值千萬注意 NULL+str的情況: null 連接任何東東都是null,所以打印也打印不出的。

IF (NULL+'abc')IS NULL PRINT 'null please don''t USE'



查詢出各科目成績第一,第二名,不通過排名函數,類似於查找各部門工資最高,第二高的。。。

object:  test就是一張學生成績表


SELECT stu_subject,MAX(score) FROM test GROUP BY stu_subject
UNION 
SELECT a.stu_subject,MAX(a.score) AS score FROM test a INNER JOIN (SELECT stu_subject,MAX(score) AS score FROM test  GROUP BY stu_subject) AS b 
ON a.score!=b.score AND a.stu_subject=b.stu_subject
GROUP BY a.stu_subject



Merge into 目的表 t

using 源表 s on t.col=s.col

when matched then 

update set t.col5=s.col5

when not matched by target (此處默認爲by target) then

insert values(s.col1,s.col2,s.col3)

利用這個取代之前 insert where not exists , update where exists  的寫法。


下面是個例子:

DECLARE @test_tb TABLE(stu_name VARCHAR(30),stu_subject VARCHAR(30),score INT , Row_ID INT IDENTITY(1,1))
INSERT  INTO 
 @test_tb
SELECT 'Mary','Earth',80
UNION 
SELECT 'test','PE',200
MERGE INTO test t
USING 
(SELECT stu_name,stu_subject,score FROM @test_tb) tb ON (t.stu_name=tb.stu_name)
WHEN MATCHED THEN 
UPDATE SET t.score=tb.score
WHEN NOT MATCHED BY TARGET THEN 
INSERT VALUES(tb.stu_name,tb.stu_subject,tb.score);

SELECT * FROM test

發佈了9 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章