SQL-在不使用游标的情况下检查表数据之间的一致性

SQL-在不使用游标的情况下检查表数据之间的一致性,sql,stored-procedures,cursor,Sql,Stored Procedures,Cursor,我使用SQL,我有4个表 tbl_项目(项目id为主键) tbl_任务(包含作为主键的任务id和作为外键的项目id) tbl_分配(包含分配\u id作为主键任务\u id作为外键) tbl_文档(包含文档id作为主键,分配id作为外键) 一个项目可以有一个或多个任务 一个任务可以有一个或多个赋值 一个assignemnt可以有一个或多个文档 现在我需要编写一个存储过程来验证项目并返回验证结果,其中项目id将作为参数传递 需要检查至少有一个任务的项目 此项目下的所有任务至少有1个任务分配 此

我使用SQL,我有4个表

  • tbl_项目(项目id为主键)
  • tbl_任务(包含作为主键的任务id和作为外键的项目id)
  • tbl_分配(包含分配\u id作为主键任务\u id作为外键)
  • tbl_文档(包含文档id作为主键,分配id作为外键)

    • 一个项目可以有一个或多个任务
    • 一个任务可以有一个或多个赋值
    • 一个assignemnt可以有一个或多个文档
  • 现在我需要编写一个存储过程来验证项目并返回验证结果,其中项目id将作为参数传递

  • 需要检查至少有一个任务的项目
  • 此项目下的所有任务至少有1个任务分配
  • 此项目/任务下的所有任务至少有1个文档
  • 我有一个临时表,需要在其中插入验证错误,如“Task-Task1不包含任何赋值”,“Assignemnt-Assignment2不包含任何文档网”等


    是否有任何方法可以在不使用游标的情况下实现此逻辑

    此类型验证不需要游标。这里有三个查询可以执行此操作:

    没有任务的项目:

    select p.*
    from tbl_projects p left outer join
         tbl_tasks t
         on p.project_id = t.project_id
    where t.project_id is null;
    
    任务至少有一个分配:

    select p.*
    from tbl_tasks t left outer join
         tbl_assignments a
         on a.task_id = t.task_id
    where a.task_id is null;
    
    所有作业至少有一个文档:

    select p.*
    from tbl_assignments a left outer join
         tbl_documents d
         on a.assignment_id = d.assignment_id
    where d.assignment_id is null;
    

    我不完全理解这个问题。这些类型的验证检查通常使用触发器而不是游标来完成。您是只想做一次检查,还是想继续验证?这将是一次。我将调用此SP检查特定项目是否有效。我不会在插入更新时验证它。你几乎。。。谢谢戈登。。。。我只需要检查与特定项目(我正在传递项目id)相关的任务/分配。因此,我认为我需要在所有语句中添加这个条件,以及在temp表中插入验证错误的逻辑。