我有一个查询,我希望从表中获得默认值(您可以在excel中将其称为vlookup)。我的查询如下:
select stamdata_sd.id_sd AS id_sd, stamdata_sd.Type_sd
AS Type_sd from stamdata_sd;
我希望查询中的Type_sd
字段是名为type_ty
的表中的默认值。像这样:
select stamdata_sd.id_sd AS id_sd, stamdata_sd.Type_sd default(selected
from a table called type_ty, where the pk id_ty is the higest)
AS Type_sd from stamdata_sd;
因此,当我在查询中创建新记录时,字段Type_sd
会自动填充type_ty
表中的最新实例。
我怎么能写这样的查询?
答案 0 :(得分:1)
您可以使用ANSI标准COALESCE
功能。此函数将按顺序测试其参数,并返回其中第一个不是null
的参数。
这将是这种形式的东西:
select
stamdata_sd.id_sd AS id_sd,
COALESCE(stamdata_sd.Type_sd,
(select max(t.name_of_colum) from type_ty t) ) AS Type_sd
from stamdata_sd
答案 1 :(得分:0)
因此,当我在查询中创建新记录时,字段type_sd为auto 填充了type_ty表中最新的instans。
您似乎希望INSERT语句从其他表中获取特定值:
insert into ZOO(animal)
values
( {the most recently added animal in the ANIMALS table} )
获取表中最近添加的行的一种方法是使用TIMESTAMP列,当插入行时,该列将使用与“now”对应的值进行更新:
create table ANIMALS(id integer primary key autoincrement,
animal text, creationdate timestamp)
N.B。数据库处理时间戳的方式各不相同,因此将上述内容视为伪代码。
insert into ANIMALS(animal) values('lion')
会导致类似这样的事情:
1, lion, 2011-09-23 08:00:05.123
您可以像这样获得最近添加的动物(假设在完全相同的毫秒内没有创建两条记录):
select animal from ANIMALS
where creationdate = (select max(creationdate) from ANIMALS)
因此:
insert into ZOO(animal)
select animal from ANIMALS
where creationdate = (select max(creationdate) from ANIMALS)
答案 2 :(得分:0)
我认为这是一个非常糟糕的设计。您的表中始终包含不正确的数据。并且列中的空值总是应该为NOT NULL
。
如果我是你,我会尝试编写BEFORE INSERT和BEFORE UPDATE触发器,以确保正确的数据始终进入基表。您可以从type_ty表中选择当前值。
使用BEFORE INSERT触发器是显而易见的。但是,如果用户尝试将其设置为NULL或空字符串,您还需要确保将良好的数据输入该列。所以你也需要一个BEFORE UPDATE触发器。
在首次修复基表中的数据和约束之后,还有很好的方法可以在客户端代码中处理此问题。客户端代码可以在会话中需要一个值,它可以用作当前值,或者它可以记住最后使用的值并将其插入用户界面(可能使用不同的值来改写它)。您可以将当前值存储在cookie中。很多方法。