当前位置: 技术问答>linux和unix
应用程序中的一条sql语句
来源: 互联网 发布时间:2016-04-08
本文导语: 环境:Linux + oracke 10.2 有如下两张表: 我希望实现,一个作业只能属于一个A类型的任务。现在给定一个A类型的任务,判断他下面所有的作业只能属于这个任务,而不能再属于其它A类型的任务。也就是说,如果A...
环境:Linux + oracke 10.2
有如下两张表:
我希望实现,一个作业只能属于一个A类型的任务。现在给定一个A类型的任务,判断他下面所有的作业只能属于这个任务,而不能再属于其它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
任务与作业是一对多的关系
下面是我尝试着写的,测试时是不对的,帮忙修改下,谢谢。
有如下两张表:
我希望实现,一个作业只能属于一个A类型的任务。现在给定一个A类型的任务,判断他下面所有的作业只能属于这个任务,而不能再属于其它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
任务与作业是一对多的关系
下面是我尝试着写的,测试时是不对的,帮忙修改下,谢谢。
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;
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;
}
if( con_task_cnt != 1 ) {
printf( "作业[%d]属于多个A类型的任务", i_job_id );
suc_flag = _NO_;
break;
}
}
if ( suc_flag == _YES_ )
strcpy( G_err_msg, "SUCC");
printf( "%sn", G_err_msg );
return suc_flag;
|
好几年不写sql了,具体代码就不写了,讲个思路你可以试一下:
101 task1 'A'
103 task3 'A'
105 task5 'A'
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
select task_info.task_id
from task_job,task_info
while task_info.task_id=task_job.task_id &&task_type='A' //取出所有任务类型为'A'的作业
groub task_job.job_id //使用作业号分组
order by count(task_job.job_id)>=2 //如果有超过两个的相同作业号,那就是说明有多个任务拥有了同一个作业了。
//代码可能不正确,不过思路就是这样
先用过程理清思路,再写CURSOR
101 task1 'A'
103 task3 'A'
105 task5 'A'
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
select task_info.task_id
from task_job,task_info
while task_info.task_id=task_job.task_id &&task_type='A' //取出所有任务类型为'A'的作业
groub task_job.job_id //使用作业号分组
order by count(task_job.job_id)>=2 //如果有超过两个的相同作业号,那就是说明有多个任务拥有了同一个作业了。
//代码可能不正确,不过思路就是这样
先用过程理清思路,再写CURSOR