问题描述
我有下表
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
值生成一行。
要解决此问题,您需要通过执行以下操作来使用相关子查询:
- 为子查询中的表设置别名,以消除它与表本身的歧义
- 添加 where 子句,确保使用别名表(例如
src
和src.FK_T1
),并在比较的另一侧显式引用表本身(例如 {{1} }) - (可选)删除
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_T1
的 FK_T1
列进行比较(就像您使用了 src
一样),因此始终为真。
src.FK_T1 = src.FK_T2