A 语句:
INSERT INTO employees (employee_id, 
                 first_name, last_name, 
                 email, phone_number,
                 hire_date, job_id, salary, 
                 commission_pct, manager_id,
                 department_id)
VALUES (99999, 'Taylor', 'DTAYLOR',
        TO_DATE('07-JUN-99', 'DD-MON-RR'),
        'ST_CLERK', 5000, 50);
B 语句:
 
INSERT INTO
        (SELECT employee_id, last_name,
                email, hire_date, job_id, salary, 
                department_id
         FROM   employees
         WHERE  department_id = 50) 
VALUES (99999, 'Taylor', 'DTAYLOR',
        TO_DATE('07-JUN-99', 'DD-MON-RR'),
        'ST_CLERK', 5000, 50);C语句:INSERT INTO  (SELECT employee_id, last_name, email,
                 hire_date, job_id, salary,department_id//
              FROM   employees 
              WHERE  department_id = 50 WITH CHECK OPTION)
VALUES (99998, 'Smith', 'JSMITH',
        TO_DATE('07-JUN-99', 'DD-MON-RR'), 
        'ST_CLERK', 5000,50 );
这个三个语句都是向employees 这个表中添加一个row ,
A语句:我很清楚,
但是 B语句 用字查询来代替表的名字,我就没有弄明白,子查询会返回很多值,这个子查询到底有什么用,而且在VALUES 值中的department_id 的值一定要和 子查询里面的department_id 的值一样吗?
如果不一样会有什么结果?C语句中加入了WITH CHECK OPTION这个标志,这个具体用来限制什么,在VALUES值中的department_id
值一定要和这个 department_id = 50 WITH CHECK OPTION 相等吗 ?如果不相等会怎么样,另外如果在select语句中去掉department_id ,这个语句还能执行成功吗?

解决方案 »

  1.   

    第2种和第3种写法是向一个视图插入数据。第3种与第2种的差别是第3种写法要求插入的数据必须满足视图的条件,也就是说新插入的数据通过视图也能查询到。如
    SQL> insert into (select c1,c2 from test where c1=11 with check option) values(13,'3');
    insert into (select c1,c2 from test where c1=11 with check option) values(13,'3')
                                   *
    ERROR at line 1:
    ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句
    SQL> insert into (select c1,c2 from test where c1=11 with check option) values(11,'3');1 row created.