Ⅰ sql:merge語句 為什麼顯示缺少關鍵字呢求解
末尾加個分號
MERGE INTO TEST3 t1
USING TEST4 t2
ON (t1.NO = t2.NO)
WHEN MATCHED THEN UPDATE
SET t1.NAME = t2.NAME,t1.HOMETOWN = t2.HOMETOWN;
Ⅱ sql merge和join的區別
您好,他們作用差別很大啊,兩個都是連表查詢,CROSS APPLY 是把兩個表合並成
一個集查詢出來(品均行比如左表7行數據,右表5行查出來就會被整合成6行數據的集);CROSS
JOIN是左表和右表乘起來的(例如左表7行數據,右表5行數據,拿出來的集就是35行數據)。
cross
join是笛卡爾集的,通常沒有join條件,通常是2個集合的關聯(表、視圖之間),如下:
select * from sys.objects
cross join sys.tables;
cross
apply是為用在給函數傳值時,如果要把表或者視圖里的很多值挨個傳給函數,就用這個,如下:
select * from
sys.dm_exec_requests r
cross apply sys.dm_exec_sql_text(r.sql_handle) s;
Ⅲ 一個SQL語句的問題,merge後面的判斷條件不可以是多個么
你這SQL語句的邏輯有問題吧,使用 al 表,如果不匹配的記錄,全部插入到 lineloss.zwxljg 表裡面了,有多少不匹配的記錄就插入多少
merge into lineloss.zwxljg t1
using (select '紅星-蘆塘' as xlmc, '基於平均電流的均方根電流演算法' as sysf
from al) t2
on (t1.xlmc = t2.xlmc and t1.sysf = t2.sysf)
when matched then
update
set ygdd = 25887.400390625,
dnsh = 80.41810449991928,
xsl = 0.31064573223444375,
pj = '正常',
sysf = '基於平均電流的均方根電流演算法',
jfgdl = 0.20779001255467103,
jgsjjlsj = to_date('2013-01-17 11:01:02', 'YYYY-MM-DD HH24:MI:SS'),
ssdw = 0
when not matched then
insert
values
('紅星-蘆塘',
25887.400390625,
80.41810449991928,
0.31064573223444375,
'正常',
'基於平均電流的均方根電流演算法',
to_date('2013-01-17 11:01:02', 'YYYY-MM-DD HH24:MI:SS'),
0,
0.20779001255467103,
lineloss.zw_xljgsjid.nextval)
Ⅳ sql:merge這個語句為什麼缺少關鍵字呢 我是照書上敲的呀 求解
你必須寫明not matched 如何處理,否則如何才能合並兩張表啊,難道,你讓oracle去猜???
Ⅳ 如何理解T-SQL中Merge語句
執行如下SQL語句:
1
2
3
4
5
6
7
8
9
10
11
MERGE INTO Student_Target AS st --這里是目標表,它將要被源表Merge
USING Student_Source AS ss --這里是源表
ON st.Sno = ss.Sno--這里是匹配條件
WHEN MATCHED--When和Then是配套的,當st.sno=ss.sno時,用ss.sname更新st.sname,我們看到這里update後面沒有寫明更新的表,這里更新的是目標表
THEN UPDATE SET st.Sname = ss.Sname
WHEN NOT MATCHED BY TARGET--目標表中不存在,而源表中存在數據,那麼就執行insert操作,這里by target可以省略,但是建議加上
THEN INSERT VALUES ( ss.Sno,ss.Sname)
WHEN NOT MATCHED BY SOURCE --當目標表中存在,而源表中不存在數據,那麼就執行delete操作,這里使用了by source
THEN DELETE
Ⅵ SQL2008中Merge的用法
create table #ttt(id int,name nvarchar(10));
merge into #ttt t
using (select 1 as id ,'eee' as name ) b
on (t.id = b.id)
when matched then
update set t.name = b.name
when not matched then
insert(id,name) values(b.id,b.name);
Ⅶ sqlerver2008R2,編寫用Merge語句
mergeProctASP1--要更新的目標表
usingProct_tmpASP2--源表
onP1.id=P2.id--更新條件(即主鍵)
whennotmatchedbytargetandP2.deleteFlag<>1
theninsertvalues(id,name,deleteFlag)--目標未知主鍵且deleteFlag不等於1插入。
whenmatchedandP2.deleteFlag=1
thendelete--源deleteFlag等於1,刪除.此語句必須以分號結束
whenmatched
thenupdatesetP1.name=P2.name;--如果主鍵匹配,更新。此語句必須以分號結束
你看看上面的執行語句符合你要求不。下面是我執行時候的結果截圖
未執行前-
Ⅷ SQL中 merge語句 沒有where子句嗎,Oricle都有
Oracle MERGE 例子
Oracle 9i 開始支持 MERGE語句
Oracle的MERGE 相對於SQL Server 2008 的 MERGE。
功能上,缺少一個 WHEN NOT MATCHED BY SOURCE 的情況。
-- 源表
CREATE TABLE test_from (id INT, val VARCHAR(20));
-- 目標表
CREATE TABLE test_to (id INT, val VARCHAR(20));
-- 插入源表
INSERT INTO test_from VALUES (1, 'A');
INSERT INTO test_from VALUES (2, 'B');
-- 合並 源表到目標表
MERGE INTO test_to
USING test_from
ON ( test_to.id = test_from.id ) -- 條件是 id 相同
WHEN MATCHED THEN UPDATE SET test_to.val = test_from.val -- 匹配的時候,更新
WHEN NOT MATCHED THEN INSERT VALUES(test_from.id, test_from.val) -- 源表有,目標表沒有,插入
-- 第一次檢查 目標表數據.
SQL> SELECT * FROM test_to;
ID VAL
---------- --------------------
1 A
2 B
-- 更新源表
UPDATE test_from SET val = 'A2' WHERE id = 1;
-- 刪除源表
DELETE FROM test_from WHERE id = 2;
-- 插入源表
INSERT INTO test_from VALUES (3, 'C');
-- 合並 源表到目標表
MERGE INTO test_to
USING test_from
ON ( test_to.id = test_from.id ) -- 條件是 id 相同
WHEN MATCHED THEN UPDATE SET test_to.val = test_from.val -- 匹配的時候,更新
WHEN NOT MATCHED THEN INSERT VALUES(test_from.id, test_from.val) -- 源表有,目標表沒有,插入
-- 再次檢查 目標表數據.
SQL> SELECT * FROM test_to;
ID VAL
---------- --------------------
1 A2
2 B
3 C
Ⅸ 關於sql中Merge語句問題
為了任務,跟帖,勿怪
Ⅹ 如何理解t-sql中merge語句
SQL Server 2008 引入了Merge關鍵字,主要是在一條語句裡面可以執行insert、update、delete操作,以實現用一個源對象的數據對目標對象數據進行操作。注意這里的」源對象「和」目標對象「我用黑色標注了,源對象和目標對象實際上不僅僅可以是表Table,還可以是臨時表、視圖、表變數、CTE,同時」目標對象「還可以是Select語句,說這么多其實想表達Merge語句可以很靈活的使用,但是我們理解的話,可以把」源對象「和」目標對象「想像成Table就行了,畢竟臨時表、視圖、表變數、CTE也都可以想像成Table。
(注意:如果目標對象是視圖的話,那麼對目標對象的操作,如update,實際上是對生成視圖的表進行操作的)。