计算的 table 列在包含共享值的行之间具有 MAX 值

Computed table column with MAX value between rows containing a shared value

我有以下table

CREATE TABLE T2
( ID_T2 integer NOT NULL PRIMARY KEY,
  FK_T1 integer,                    <--- foreign key to T1(Table1)
  FK_DATE date,                     <--- foreign key to T1(Table1)
  T2_DATE date,                     <--- user input field
  T2_MAX_DIFF COMPUTED BY ( (SELECT DATEDIFF (day, MAX(T2_DATE), CURRENT_DATE) FROM T2 GROUP BY FK_T1) )
);

我希望 T2_MAX_DIFF 显示自上次输入所有具有共同 FK_T1 的相似条目以来的天数。

它确实有效,但如果将另一个 FK_T1 值添加到 table,我会收到有关 “单例中的多行 select”的错误".

我假设我需要某种 WHERE FK_T1 = FK_T1 of corresponding row。可以添加这个吗?我正在使用 Firebird 3.0.7 和 flamerobin。

错误 “单例中的多行 select” 表示应该提供单个标量值的查询生成了多行。这对于使用 GROUP BY FK_T1 的查询来说并不意外,因为它将为每个 FK_T1 值生成一行。

要解决此问题,您需要通过执行以下操作来使用相关子查询:

  1. 在子查询中为 table 设置别名,以消除它与 table 本身的歧义
  2. 添加一个 where 子句,确保使用别名 table(例如 srcsrc.FK_T1),并为另一个明确引用 table 本身比较的一侧(例如 T2.FK_T1
  3. (可选)删除 GROUP BY 子句,因为给定 WHERE 子句没有必要。但是,保留 GROUP BY 可能会发现某些类型的错误。

结果子查询变为:

(SELECT DATEDIFF (day, MAX(src.T2_DATE), CURRENT_DATE) 
 FROM T2 src 
 WHERE src.FK_T1 = T2.FK_T1 
 GROUP BY src.FK_T1)

注意子查询中引用的 table 的别名 src,条件中 src.FK_T1 的使用,以及 table 在 T2.FK_T1 引用 table 本身的当前行的列。如果您使用 src.FK_T1 = FK_T1,它将与 srcFK_T1 列进行比较(就像您使用 src.FK_T1 = src.FK_T2 一样),所以这将始终为真。

CREATE TABLE T2
( ID_T2 integer NOT NULL PRIMARY KEY,
  FK_T1 integer, 
  FK_DATE date,
  T2_DATE date,
  T2_MAX_DIFF COMPUTED BY ( (
    SELECT DATEDIFF (day, MAX(src.T2_DATE), CURRENT_DATE) 
    FROM T2 src 
    WHERE src.FK_T1 = T2.FK_T1 
    GROUP BY src.FK_T1) )
);