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是什么意思.

解决方案 »

  1.   

    EXISTS                (SELECT b.dlfymc FROM fydlfybm b WHERE a.dlfybm = b.dlfybm);说明如果这个返回True和False如果存在返回True
      

  2.   

    SQL的语法不是先看SELECT里的,所以不存在先引用b的说法,首先是判断FROM后的表对象是否存在,然后有别名的就起别名.,所以b正是fydlfybm表的别名.
    EXISTS表示相关子查询的结果为TRUE就进行更新,也就是判断EXISTS后的子句返回为TRUE还是FLASE
      

  3.   

    个人认为 别名a 和 别名b 主要是为 exists 用的 因为 可能是语法问题!
      

  4.   


    也就是说,EXISTS 后面如果是真就执行前面的.如果是假就不执行是吧.
      

  5.   

    过滤数据,可以这么想,但不是C/C++那些语言一样,不是什么执行什么不执行的.
    SQL是处理数据集合的,也就是提取数据,然后根据条件进行过滤数据的,不像过程式语言
      

  6.   


    --建立测试语句
    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;
      
      

  7.   

    1、b就是fydlfybm的别名    不信你执行“ SELECT b.dlfymc FROM fydlfybm b “,可以执行成功的
       具体的原理我也不清楚,可以参照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,就表示资料存在,条件成立;  反之条件不成立
      

  8.   

    这用merge函数就可以解决了,楼主写的有点复杂了。
    对FYMXrhz和表fydlfybm相同的dlfybm对应的记录的dlfymc,修改为表fydlfybm对应的dlfymc。
    这是merge函数的典型的用法,6楼是正解
      

  9.   

    FYMXrhz a,fydlfybm b;a是表FYMXrhz别名,相当于小名,b是表fydlfybm的别名。
    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)查询有结果的情况下更新,当查询结果为空时则不执行更新。
      

  10.   

    顶一个
    A是 FYMXrhz的别名
    B是 FYDLFYBM的别名
    EXIST子句标明如果有结果集返回(>=1行)就为TRUE