计算表列,包含共享值的行之间的最大值



我有以下表格

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的值生成一行。

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

  1. 子查询中的表别名,以消除它与表本身的歧义
  2. 添加where子句,确保使用别名表(例如srcsrc.FK_T1),并显式引用表本身用于比较的另一边(例如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)

注意子查询中引用的表的别名src,在条件中使用src.FK_T1,以及显式使用T2.FK_T1中的表来引用表本身当前行的列。如果您使用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) )
);

相关内容

  • 没有找到相关文章

最新更新