UPDATE FYMXrhz a SET a.dlfymc = (SELECT b.dlfymc FROM fydlfybm b WHERE a.dlfybm = b.dlfybm)
WHERE EXISTS (SELECT b.dlfymc FROM fydlfybm b WHERE a.dlfybm = b.dlfybm);
我知道A是 FYMXrhz的别名对吧.
这个B是什么.难道是FYDLFYBM的别名吗,我看是先引用B再定义的别名,这样也可以?
还有.最后的WHERE EXISTS是什么意思.
EXISTS表示相关子查询的结果为TRUE就进行更新,也就是判断EXISTS后的子句返回为TRUE还是FLASE
也就是说,EXISTS 后面如果是真就执行前面的.如果是假就不执行是吧.
SQL是处理数据集合的,也就是提取数据,然后根据条件进行过滤数据的,不像过程式语言
--建立测试语句
CREATE TABLE FOO(
ID NUMBER(10),
NAME VARCHAR2(10)
)
;
CREATE TABLE BAR(
ID NUMBER(10),
NAME VARCHAR2(10)
)
;
INSERT INTO FOO VALUES(1,'ZIWEN1');
INSERT INTO FOO VALUES(2,'ZIWEN2');
INSERT INTO BAR VALUES(1,'ZIWEN3');SELECT * FROM BAR;
SELECT * FROM FOO;
--现在的需求是将FOO里面的BAR更新为与BAR里面一样的,语句如下:
UPDATE FOO SET FOO.NAME = (SELECT NAME FROM BAR WHERE FOO.ID = BAR.ID);
SELECT * FROM FOO;
--至于第一个问题,就是给FOO 表 和BAR表起了一个别名而已,因为ORACLE并不是按照顺序去解析你的SQL的,这个仅仅是为了能够让你比较容易的编写SQL
--想象一下,某个表被二逼架构起了一个ASDFGSDF4SFE5SF6的名字,你给它起一个别名 A能够简化很多SQL编写。
--如下:
UPDATE FOO A SET A.NAME = (SELECT NAME FROM BAR B WHERE A.ID = B.ID);
--如果你执行上面的结果会发现,FOO表中的ID为2的字段也被更新了
--因为没有告诉ORACLE,“我只更新存在于FOO表中,同时也存在BAR表中的数据”,加上EXISTS就不会导致ID为2的也被更新
UPDATE FOO A SET A.NAME = (SELECT NAME FROM BAR B WHERE A.ID = B.ID)
WHERE EXISTS(SELECT 1 FROM BAR C WHERE A.ID = C.ID);
--上面的SQL还可以这样写
UPDATE FOO A SET A.NAME = (SELECT NAME FROM BAR B WHERE A.ID = B.ID)
WHERE A.ID IN (SELECT C.ID FROM BAR C WHERE A.ID = C.ID);--同时也可以使用MERGE语句来实现上面的SQL更新
MERGE INTO FOO A
USING BAR B
ON (A.ID = B.ID)
WHEN MATCHED THEN
UPDATE SET A.NAME = B.NAME;
具体的原理我也不清楚,可以参照2楼的2、WHERE EXISTS (SELECT b.dlfymc FROM fydlfybm b WHERE a.dlfybm = b.dlfybm);
如果 SELECT b.dlfymc FROM fydlfybm b WHERE a.dlfybm = b.dlfybm 查询出的资料数量大于0,就表示资料存在,条件成立; 反之条件不成立
对FYMXrhz和表fydlfybm相同的dlfybm对应的记录的dlfymc,修改为表fydlfybm对应的dlfymc。
这是merge函数的典型的用法,6楼是正解
sql语句 UPDATE FYMXrhz a SET a.dlfymc = (SELECT b.dlfymc FROM fydlfybm b WHERE a.dlfybm = b.dlfybm)这半段表示查询b表中dlfybm列值和当前a表中的记录的dlfybm列值相同的记录的dlfymc列值,把其赋给a的dlfymc列,
如果没有后半句,WHERE EXISTS (SELECT b.dlfymc FROM fydlfybm b WHERE a.dlfybm = b.dlfybm),遇到(SELECT b.dlfymc FROM fydlfybm b WHERE a.dlfybm = b.dlfybm)查询结果为空的情况时,此时就把a的dlfymc修改为null,
加上后半句,WHERE EXISTS (SELECT b.dlfymc FROM fydlfybm b WHERE a.dlfybm = b.dlfybm),则只会在(SELECT b.dlfymc FROM fydlfybm b WHERE a.dlfybm = b.dlfybm)查询有结果的情况下更新,当查询结果为空时则不执行更新。
A是 FYMXrhz的别名
B是 FYDLFYBM的别名
EXIST子句标明如果有结果集返回(>=1行)就为TRUE