计算的 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
值生成一行。
要解决此问题,您需要通过执行以下操作来使用相关子查询:
- 在子查询中为 table 设置别名,以消除它与 table 本身的歧义
- 添加一个 where 子句,确保使用别名 table(例如
src
和 src.FK_T1
),并为另一个明确引用 table 本身比较的一侧(例如 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)
注意子查询中引用的 table 的别名 src
,条件中 src.FK_T1
的使用,以及 table 在 T2.FK_T1
引用 table 本身的当前行的列。如果您使用 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) )
);
我有以下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
值生成一行。
要解决此问题,您需要通过执行以下操作来使用相关子查询:
- 在子查询中为 table 设置别名,以消除它与 table 本身的歧义
- 添加一个 where 子句,确保使用别名 table(例如
src
和src.FK_T1
),并为另一个明确引用 table 本身比较的一侧(例如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)
注意子查询中引用的 table 的别名 src
,条件中 src.FK_T1
的使用,以及 table 在 T2.FK_T1
引用 table 本身的当前行的列。如果您使用 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) )
);