2014-09-02 22 views
0

我试图更新与CHECKLIST_INSTANCE_ID关联的问题表(ATTRIBUTE_ID),其中清单尚未在本地工作流工具中完成。我们用新的问题修改了一份纸质清单,修改了一些旧的问题,并且需要将问题重新提交给不完整的清单。sql语句循环选定的值并使用这些循环值执行其他sql调用

对于每个下面的清单实例ID,钙IDS,以及钙加快转速

(Statement A)  
SELECT CHECKLIST_INSTANCE_ID, CALC_ID, CALC_REV FROM CHECKLIST_INSTANCE WHERE CHECKLIST_CLASS_ID = '200' and (CHECKLIST_STATE is null OR CHECKLIST_STATE = '0') 

滴在回答表的问题(ATTRIBUTE_ID)(只需要清单实例ID作为PK)

(Statement B) 
DELETE FROM CHECKLIST_ANSWER WHERE CHECKLIST_INSTANCE_ID='The instance Id from statement A' 

并使用相同的实例ID,calc id,calc rev以上重新插入最新的rev问题(ATTIBUTE_ID)。但是,使用该查询的最新问题:

(Statement C) 
SELECT CHECKLIST_ATTRIBUTE.ATTRIBUTE_ID FROM CHECKLIST_ATTRIBUTE WHERE IS_ACTIVE='1' AND CHECKLIST_ATTRIBUTE.CHECKLIST_CLASS_ID = '200' 

(Statement D) 
INSERT INTO CHECKLIST_ANSWER (CHECKLIST_INSTANCE_ID, CALC_ID, CALC_REV, ATTRIBUTE_ID) Values ('CHECKLIST_INSTANCE_ID from statement A', 'CALC_ID from statement A', ' CALC_REV from statement A', 'attribute id from select statement C') 

有超过60个问题,我需要换出的约40清单实例,因此我希望不必手工写一个SQLLOADER输入文件,而是使用不知怎的,上面4条语句。

编辑 好,我有一个查询,做了叉乘对新问题的Id

with 
    incomplete_checklists AS (SELECT CHECKLIST_INSTANCE_ID, CALC_ID, CALC_REV 
    FROM TPQOT_CHECKLIST_INSTANCE WHERE CHECKLIST_CLASS_ID = '1257877690209' and (CHECKLIST_STATE is null OR CHECKLIST_STATE = '0') 
), 
    newest_questions as (SELECT TPQOT_CHECKLIST_ATTRIBUTE.ATTRIBUTE_ID FROM 
    NAVARCH.TPQOT_CHECKLIST_ATTRIBUTE WHERE IS_ACTIVE='1' AND 
    TPQOT_CHECKLIST_ATTRIBUTE.CHECKLIST_CLASS_ID = '1257877690209') 
SELECT CHECKLIST_INSTANCE_ID, CALC_ID, CALC_REV, ATTRIBUTE_ID <-will change to INSERT when ready 
FROM incomplete_checklists , newest_questions 

艰难的部分是我现在需要做的Delete B中将

+0

你怎么知道从查询行结合查询C中的哪些行进入D? – Laurence 2014-09-02 20:41:29

+0

来自语句A的所有记录都应该与来自语句C的所有记录交叉倍数,以形成INSERT语句D. – jeff 2014-09-02 20:51:00

回答

1

你应该能够将它们组合成两个查询,如下所示:

delete 
    checklist_answer a 
where 
    exists (
     select 
      'x' 
     from 
      checklist_instance i 
     where 
      i.checklist_instance_id = a.checklist_instance_id and 
      i.checklist_class_id = '200' and 
      nvl(checklist_state, '0') = '0' 
    ) 

insert into checklist_answer (
    checklist_instance_id, 
    calc_id, 
    calc_rev, 
    attribute_id 
) select 
    i.checklist_instance_id, 
    i.calc_id, 
    i.calc_rev, 
    c.attribute_id 
from 
    checklist_instance i 
     cross join 
    checklist_attribute c 
where 
    i.checklist_instance_id = c.checklist_instance_id and 
    i.checklist_class_id = '200' and 
    nvl(checklist_state, '0') = '0' and 
    c.is_active = '1' and 
    c.checklist_class_id = '200' 

也可以将第EM到使用Merge

+0

让我玩弄这个。我也编辑了我的问题,因为我能够得到它的一部分工作 – jeff 2014-09-02 21:03:37

+0

a.checklist_instance_id无效标识符ORA-00904错误。 – jeff 2014-09-04 15:40:47

+0

这应该是'c.checklist_instance_id' – Laurence 2014-09-04 21:13:56

0

所以这里一个查询是SQL调用我终于用

DELETE FROM CHECKLIST_ANSWER WHERE CHECKLIST_INSTANCE_ID IN (
    SELECT CHECKLIST_INSTANCE_ID FROM CHECKLIST_INSTANCE 
     WHERE CHECKLIST_CLASS_ID = '200' AND 
     (CHECKLIST_STATE is null OR CHECKLIST_STATE = '0')) 

...然后...

INSERT INTO CHECKLIST_ANSWER ( 
    CHECKLIST_INSTANCE_ID, CALC_ID, CALC_REV, ATTRIBUTE_ID) 
WITH incomplete_checklists AS (
    SELECT CHECKLIST_INSTANCE_ID, CALC_ID, CALC_REV 
    FROM CHECKLIST_INSTANCE 
    WHERE CHECKLIST_CLASS_ID = '200' AND 
    (CHECKLIST_STATE is null OR CHECKLIST_STATE = '0') 
), 
    newest_questions AS (
    SELECT CHECKLIST_ATTRIBUTE.ATTRIBUTE_ID 
    FROM CHECKLIST_ATTRIBUTE 
    WHERE IS_ACTIVE='1' AND CHECKLIST_ATTRIBUTE.CHECKLIST_CLASS_ID = '200' 
) 
    SELECT CHECKLIST_INSTANCE_ID, CALC_ID, CALC_REV, ATTRIBUTE_ID 
    FROM incomplete_checklists, newest_questions