SQL从表中选择查询中的默认值

时间:2011-09-23 11:39:05

标签: sql

我有一个查询,我希望从表中获得默认值(您可以在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表中的最新实例。

我怎么能写这样的查询?

3 个答案:

答案 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中。很多方法。