环境:Linux + oracke 10.2有如下两张表:
我希望实现,一个作业只能属于一个A类型的任务。也就是说,如果A类型的任务101,它拥有编号为1作业时,那么其它A类型的任务就不能再拥有作业1了,而对于B类型的任务,就可以拥有作业1。例如:任务105不能再拥有作业1,表中有错误。而任务106则可以拥有作业1.
请教sql语句:如何编写来检测到一个作业是否属于多个A类型的任务,检测到时报错。比如:任务101非法,因为有作业1属于多个A类型的任务谢谢!任务信息表:task_info
    task_id   task_name   task_type
    101        task1       'A'
    102        task2       'B'
    103        task3       'A'
    104        task4       'B'
    105        task5       'A'
    106        task6       'B'
    
    主键:task_id
    
任务与作业关系表:task_job
    task_id,  task_name, job_id
    101       task1       1
    101       task1       2
    101       task1       3
    102       task2       4
    102       task2       5
    103       task3       6
    104       task4       7
    104       task4       8
    105       task5       1
    105       task5       9
    105       task5       10
    106       task6       1
    106       task6       1
    
    主键:taskid, job_id
   任务与作业是一对多的关系

解决方案 »

  1.   

    下面是我写的嵌入到C里面的一段代码,希望老师给予指导。EXEC SQL DECLARE con_task_check_cur CURSOR FOR
             SELECT job_id
     FROM task_job
     WHERE task_id = 2;
     if( SQLCODE != SQLSUCC && SQLCODE != SQLNOTFOUND ) {
     err_log( __FILE__,__LINE__, "declare failed!" );
     return _FAIL_;
     } EXEC SQL OPEN con_task_check_cur;
     if( SQLCODE != SQLSUCC && SQLCODE != SQLNOTFOUND ) {
     err_log( __FILE__,__LINE__, "open failed!" );
     return _FAIL_;
     } while( 1 ) {
            EXEC SQL FETCH con_task_check_cur INTO :i_job_id;
            if( SQLCODE == SQLNOTFOUND )
                break;printf( "ÈÎÎñ2×÷ҵΪ£ºi_job_id = [%d]\n", i_job_id );
            if( SQLCODE != SQLSUCC ) {
                err_log( __FILE__,__LINE__,"fetch failed![%d]", SQLCODE );
                suc_flag = _FAIL_;
                break;
            }
            EXEC SQL SELECT COUNT(*) INTO :con_task_cnt
                      FROM task_job T1, task_info T2
                     WHERE   T1.job_id  = :i_job_id
                       AND   T2.task_id = T1.task_id
                       AND T2.task_type = 1;       if( SQLCODE != SQLSUCC && SQLCODE != SQLNOTFOUND ) {
               err_log( __FILE__,__LINE__, "select failed!" );
               suc_flag = _FAIL_;
               break;
           }printf( "con_task_cnt = [%d]\n", con_task_cnt );
           if( con_task_cnt != 1 ) {
               memset( G_err_msg, 0x00, sizeof( G_err_msg ) );
               sprintf( G_err_msg,"×÷Òµ[%d]ÊôÓÚ¶à¸öÈÕ³£Ð͵÷¶ÈÈÎÎñ", i_job_id );
               suc_flag = _NO_;
               break;
           }
    printf( "%d\n", con_task_cnt );
        }    if ( suc_flag == _YES_ )
           strcpy( G_err_msg, "SUCC");    printf( "%s\n", G_err_msg );
        return suc_flag;
      

  2.   

    试一下,下面查询可以查到非法的作业及其和‘A’任务的个数
    select job_id,count(*) from from task_job,task_info 
    where task__type='A' and task_job.task_id=task_info.task_id
    group by job_id
    having count(*)>1
    下面查询返回非法作业的个数
    select count(count(*)) from from task_job,task_info 
    where task__type='A' and task_job.task_id=task_info.task_id
    group by job_id
    having count(*)>1
      

  3.   

    楼上的很感谢。
    我忘了说一点要求,应当只需要查询给定的任务下面的所有作业是否在其它A类型的任务中有冲突。也就是说,给我一个任务ID,我查询他下面的所有作业是否合法。
    你现在给我的语句可以查出所有非法的A任务,但这里面并不一定就包含了给定的那个任务。
    如果已知的那个任务合法的话我可以先不管其它的。
    如何把给定的任务ID作为一个条件加进上面的SQL语句呢?
    谢谢!