我有以下表格
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值被添加到表中,我得到一个关于&;多行在单例select&;的错误。
我假设我需要某种WHERE FK_T1 = FK_T1 of corresponding row
。可以加上这个吗?我使用Firebird 3.0.7与flamerobin。
错误"multiple rows in singleton select">表示应该提供单个标量值的查询产生了多个行。对于使用GROUP BY FK_T1
的查询,这并不意外,因为它将根据FK_T1
的值生成一行。
要解决这个问题,您需要通过执行以下操作来使用相关子查询:
- 子查询中的表别名,以消除它与表本身的歧义
- 添加where子句,确保使用别名表(例如
src
和src.FK_T1
),并显式引用表本身用于比较的另一边(例如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
,它将与src
的FK_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) )
);