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

问题描述

我有下表

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 值添加到表中,我会收到关于 “单例选择中的多行”错误

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

解决方法

错误“单例选择中的多行”意味着应该提供单个标量值的查询产生了多行。这对于带有 GROUP BY FK_T1 的查询来说并不意外,因为它会为每个 FK_T1 值生成一行。

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

  1. 为子查询中的表设置别名,以消除它与表本身的歧义
  2. 添加 where 子句,确保使用别名表(例如 srcsrc.FK_T1),并在比较的另一侧显式引用表本身(例如 {{1} })
  3. (可选)删除 T2.FK_T1 子句,因为在 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) ,条件中src的使用,以及src.FK_T1中表的显式使用表本身的当前行。如果您使用 T2.FK_T1,它将与 src.FK_T1 = FK_T1FK_T1 列进行比较(就像您使用了 src 一样),因此始终为真。

src.FK_T1 = src.FK_T2