1. 程式人生 > >update關聯更新,主查詢切記寫上條件!!!!!!!!!!!

update關聯更新,主查詢切記寫上條件!!!!!!!!!!!

SQL> select empno,ename,deptno,dname from emp;

     EMPNO ENAME	  DEPTNO DNAME
---------- ---------- ---------- --------------------------------------------------
      7369 SMITH	      20 noname
      7499 ALLEN	      30 noname
      7521 WARD 	      30 noname
      7566 JONES	      20 noname
      7654 MARTIN	      30 noname
      7698 BLAKE	      30 noname
      7782 CLARK	      10 noname
      7788 SCOTT	      20 noname
      7839 KING 	      10 noname
      7844 TURNER	      30 noname
      7876 ADAMS	      20 noname

     EMPNO ENAME	  DEPTNO DNAME
---------- ---------- ---------- --------------------------------------------------
      7900 JAMES	      30 noname
      7902 FORD 	      20 noname
      7934 MILLER	      10 noname
      1111 YODA 		 noname

已選擇15行。


 需求:
-----------只更新部門10、20的dname

一般人都會這麼寫:
UPDATE emp
   SET emp.dname =
       (SELECT dept.dname
          FROM dept
         WHERE dept.deptno = emp.deptno
           AND dept.deptno IN (10, 20));

SQL>  select empno,ename,deptno,dname from emp;

     EMPNO ENAME	  DEPTNO DNAME
---------- ---------- ---------- --------------------------------------------------
      7369 SMITH	      20 RESEARCH
      7499 ALLEN	      30
      7521 WARD 	      30
      7566 JONES	      20 RESEARCH
      7654 MARTIN	      30
      7698 BLAKE	      30
      7782 CLARK	      10 ACCOUNTING
      7788 SCOTT	      20 RESEARCH
      7839 KING 	      10 ACCOUNTING
      7844 TURNER	      30
      7876 ADAMS	      20 RESEARCH

     EMPNO ENAME	  DEPTNO DNAME
---------- ---------- ---------- --------------------------------------------------
      7900 JAMES	      30
      7902 FORD 	      20 RESEARCH
      7934 MILLER	      10 ACCOUNTING
      1111 YODA

已選擇15行。

我只更新10和20為掃描30被更新成空值了呢?

Plan hash value: 2456638059
 
-----------------------------------------------------------------------------------------
| Id  | Operation                     | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT              |         |    15 |   450 |     2   (0)| 00:00:01 |
|   1 |  UPDATE                       | EMP     |       |       |            |          |
|   2 |   TABLE ACCESS FULL           | EMP     |    15 |   450 |     2   (0)| 00:00:01 |
|*  3 |   FILTER                      |         |       |       |            |          |
|   4 |    TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    13 |     1   (0)| 00:00:01 |
|*  5 |     INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - filter(:B1=10 OR :B2=20)
   5 - access("DEPT"."DEPTNO"=:B1)
       filter("DEPT"."DEPTNO"=10 OR "DEPT"."DEPTNO"=20)


當主查詢給子查詢傳值的時候:B1


相當於子查詢為:

SELECT dept.dname
          FROM dept
         WHERE dept.deptno = :B1;
           AND dept.deptno IN (10, 20)

當傳入30部門時,返回為空,所以30部分的資料都被跟新為空了


正確寫法:
UPDATE emp
   SET emp.dname =
       (SELECT dept.dname
          FROM dept
         WHERE dept.deptno = emp.deptno
           AND dept.deptno IN (10, 20))
           where emp.deptno in (10, 20)

相關推薦

update關聯更新,查詢切記條件

SQL> select empno,ename,deptno,dname from emp; EMPNO ENAME DEPTNO DNAME ---------- ---------- ---------- ---------------------

外鍵關聯鍵id時-hbm.xml配置,及其分頁查詢DaoImpl

foreign opp style area ringbuf ber getc ram n-k 表關聯時,外鍵關聯非主鍵id時-hbm.xml配置: (由於hibernate默認為關聯主鍵查詢,故需要配置相關hql語句的屬性) <many-to-one name=

mysql資料庫根據關聯更新指定欄位值

需求: 現有兩個表分別為 person_info2  和 person_info ,person_info2 表資料不變,當person_info2表中的主鍵和person_info2 表的主鍵相同時,則更新person_info2 表中其他欄位更新為per

sqlce不支援關聯更新update from)的替代方案

public class SqlCeBatchUpated { public string ConnStr { set; get; } public delegate void MyUpdate(SqlCeCommand cmd, Sql

UPDATE多表關聯更新時為什麼會慢

構建環境如下: Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 Connected as [email protected]:1521/orcl SQL> C

TFS支援移動裝置,微軟已經走出了第一步(手機更新查詢工作項)

TFS支援移動裝置,微軟已經走出了第一步(手機上更新、查詢工作項) TFS支援移動裝置,微軟已經走出了第一步! 從現在開始,你可以在手機瀏覽器上開啟自己的VSTS團隊專案,會看大手機版的工作項介面,你可以在手機裝置上更新、查詢工作項。 這是原生自帶的,這些移動功能馬上就會應用到後續

Access update語句 提示 "操作必須使用一個可更新查詢"

當在access中使用update語句時如果遇到"操作必須使用一個可更新的查詢"提示資訊,通常時許可權設定問題但是有一種情況非常特殊,舉例如下:表A(col1, col2) 表B(col1, col2) 如何實現下述SQL的功能? update A, (select c

oracle update select (更新查詢的sql)

(1).update   tableName   set   (a,b,c)=(select   a,b,c   from   ida   where   ida.id=tableName.id); (2).update   tableName t1   set  

Github fork了別人的程式碼 本地更新分支程式碼

在GitHub上我們會去fork別人的一個專案,這就在自己的Github上生成了一個與原作者專案互不影響的副本,自己可以將自己Github上的這個專案再clone到本地進行修改,修改後再push,只有自己Github上的專案會發生改變,而原作者專案並不會受影響,

Update關聯查詢不走索引,效率低下

   優化一個sql,就是有A,B兩個表,要利用b表的欄位更新a表對應的欄位。形如Sql程式碼  update A set A.a=(select B.b from B where A.id=B.id);  原SQLupdatepntmall_rptpoint_detail

update left join 多表關聯更新

UPDATE table_1 t1 left join table_2 t2 on t2.id = t1.tid SET t1.username = t2.uname where t1.id>5

mysql update in 巢狀子查詢更新

更新該句 update punchcard_tbl set percheck=3 where id in (select id punchcard where id=1) 在 MySQL 命令列工具中傳回:ERROR 1093 (HY000): You can't spec

SQL update多表關聯更新

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) ; update TA a set(name, re

Oracle多表關聯更新update多表關聯

.Oracle沒有update from語法,可以通過兩種實現方式: 1、利用子查詢:      update    A        SET    欄位1=(select    欄位表示式    from    B    WHERE    ...),       

SQL update 多表關聯更新

實現多表更新,尤其是A表和A的子表B表資料更新,下面是例子 有A、B張表,其記錄如下: A表 c1       c2 -------------- 1       a1 2       a2 3  

UPDATE與多表關聯更新

SQL環境:SQL Server 2008業務需求:將查詢的記錄集合更新部分欄位,涉及到多張表1.SQL查詢獲得的記錄集合:SELECT u.USER_NAME_,g.desc_, u.email_,

mysql-不恰當的update語句使用鍵和索引導致mysql死鎖

行修改 sql錯誤 狀態 還要 錯誤日誌 示意圖 http 概率 最小 背景知識:MySQL有三種鎖的級別:頁級、表級、行級。 MyISAM和MEMORY存儲引擎采用的是表級鎖(table-level locking);BDB存儲引擎采用的是頁面鎖(page-level l

關於Rack()自增長的一則雙表關聯更新

oracle 排序 rank A表(tb_abc):AB1aa02002bb03003cc05004dd18005ee22006ff3300B表(tb_abcc):AB1aa(0201)2aa(0202)3bb(0301)4bb(0302)5bb(0303)6cc(0501)括號裏是預期值規則:

為我的外婆和奶奶我的挽歌

最好的 大自然 暴露 日子 世界 人類 一個地方 生存 說過 我在我出生的時候我的外公就不在了,聽人說是文革時候被弄死的。是你獨自把包括我媽在內的4個女兒拉扯大的。 我小時候我的父親參軍還在部隊沒有回來,母親在另一個地方工作,是你把我拉扯到了5歲直

sqlserver關聯更新問題

rom date 所有 問題 目的 from myba lec cor 大家都知道update更新語句:update 表名 set 字段=值。似乎很簡單 但是今天我遇到這樣一個問題:我需要更新一張叫PO_SPECIAL_TASK_LINE表的score字段,這個分數通過另外