Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据多个关系中的条件限制关系中的条目数_Sql_Postgresql - Fatal编程技术网

Sql 根据多个关系中的条件限制关系中的条目数

Sql 根据多个关系中的条件限制关系中的条目数,sql,postgresql,Sql,Postgresql,我正在使用PostgreSQL,并试图限制学生可以同时获得的贷款数量。为此,我创建了一个CTE,它选择按StudentID分组的所有未归还贷款,并统计每个StudentID的未归还贷款数量。然后,我尝试创建一个检查约束,使用该CTE限制学生最多可以同时获得7笔贷款 下面的代码不起作用,因为它在语法上是无效的,但希望它能够传达我试图实现的内容。有人知道我如何实施我想要的贷款限制吗 创建表贷款 id串行主键, 复制\u id整数引用媒体\u复制\u id, 帐户id INT引用帐户id, 贷款日期不

我正在使用PostgreSQL,并试图限制学生可以同时获得的贷款数量。为此,我创建了一个CTE,它选择按StudentID分组的所有未归还贷款,并统计每个StudentID的未归还贷款数量。然后,我尝试创建一个检查约束,使用该CTE限制学生最多可以同时获得7笔贷款

下面的代码不起作用,因为它在语法上是无效的,但希望它能够传达我试图实现的内容。有人知道我如何实施我想要的贷款限制吗

创建表贷款 id串行主键, 复制\u id整数引用媒体\u复制\u id, 帐户id INT引用帐户id, 贷款日期不为空, 到期日不为空, 返回日期, 使用currentStudentLoans学生id,当前贷款为 选择帐户id,计数* 贷款 在“从学生选择id”中选择帐户id的位置 返回日期为空 按帐户\u id分组 约束最大学生并发贷款检查 从0到7之间的currentStudentLoans中选择current_loans ; 对于附加的和可选的上下文,我提供了一个数据库模式的ER图。

您不能使用这样的在线CTE进行此操作。你有几个选择

第一个是UDF和check约束。本质上,CTE中的逻辑放在UDF中,然后检查约束验证数据

第二个是对该表进行检查的触发器。然而,这很棘手,因为计数在同一张表上

第三种方法是将总数存储在另一个表(可能是accounts)中,并使其保持最新,以便在此表上进行插入、更新和删除。要使该价值保持最新,就需要触发贷款。然后可以对帐户设置检查约束

我不确定哪种解决方案最适合您的总体方案。第一个最接近你现在正在做的事情。第三种方法公布了计数,因此更清楚地知道发生了什么