ORACLE多表關聯UPDATE 語句
阿新 • • 發佈:2017-08-21
dbms 說明 相同 linux 全國 別名 所有 問題 from
1) 最簡單的形式
SQL 代碼--經確認customers表中所有customer_id小於1000均為‘北京‘
--1000以內的均是公司走向全國之前的本城市的老客戶:)
update customers
set city_name=‘北京‘
where customer_id<1000
2) 兩表(多表)關聯update -- 僅在where字句中的連接
SQL 代碼![技術分享](/img/fz.gif)
--這次提取的數據都是VIP,且包括新增的,所以順便更新客戶類別
update customers a -- 使用別名
set customer_type=‘01‘ --01 為vip,00為普通
where exists (select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)
![技術分享](/img/fz.gif)
3) 兩表(多表)關聯update -- 被修改值由另一個表運算而來
SQL 代碼![技術分享](/img/fz.gif)
update customers a -- 使用別名
set city_name=(select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id)
where exists (select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)
-- update 超過2個值
update customers a -- 使用別名
set (city_name,customer_type)=(select b.city_name,b.customer_type
from tmp_cust_city b
where b.customer_id=a.customer_id)
where exists (select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)
![技術分享](/img/fz.gif)
-- 方法1.
UPDATE
表2
SET
表2.C = (
SELECT
B
FROM
表1
WHERE
表1.A = 表2.A)
WHERE
EXISTS (
SELECT
1
FROM
表1
WHERE
表1.A = 表2.A)
-- 方法2
MERGE
INTO
表2
USING 表1
ON
( 表2.A = 表1.A )
-- 條件是 A 相同
WHEN
MATCHED
THEN
UPDATE
SET
表2.C = 表1.B
-- 匹配的時候,更新
二,
oracle隨機讀取表中的N條數據方法:
1)
select
*
from
(
select
*
from
tablename
order
by
sys_guid())
where
rownum < N;
2)
select
*
from
(
select
*
from
tablename
order
by
dbms_random.value)
where
rownum< N;
3)
select
*
from
(
select
*
from
table_name sample(10)
order
by
trunc(dbms_random.value(0, 1000)))
where
rownum < N;
說明:
sample(10)含義為檢索表中的10%數據,sample值應該在[0.000001,99.999999]之間,其中 sys_guid() 和 dbms_random.value都是內部函數
註:
在使1)方法時,即使用sys_guid() 這種方法時,有時會獲取到相同的記錄,即:和前一次查詢的結果集是一樣的(可能是和操作系統有關:windows正常,linux異常;也可能是因為sys_guid()函數本身的問題,有待繼續研究)
所以,為確保在不同的平臺每次讀取的數據都是隨機的,建議采用2)和3)兩種方案,其中2)方案更常用。3)方案縮小了查詢的範圍,在查詢大表,且要提取數據不是很不多的情況下,會對查詢速度上有一定的提高
ORACLE多表關聯UPDATE 語句