2011-09-23 58 views
2

我有一个查询,我希望从表中有一个默认值(您可以称它为Excel中的vlookup)。我的查询是这样的:SQL从表中查询默认值

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

有没有令人信服的理由不在表中存储正确的值stamdata_sd? –

+0

以在输入新数据时确定工作流程。那么用户不必键入该值,并且该值随时间变化,所以我不能将其设置为默认值。 – Thomas

+0

ups ...那实际上是错误的... – Thomas

回答

0

我认为这是一个非常糟糕的设计。你的表格总是会有不正确的数据。并且它总是会有一些空值,可能应该是NOT NULL

如果我是你,我会尝试编写一个BEFORE INSERT和BEFORE UPDATE触发器,以确保正确的数据总是进入基表。您可以从您的type_ty表中选择当前值。

使用BEFORE INSERT触发器很明显。但是,如果用户尝试将其设置为NULL或空字符串,则还需要确保良好的数据进入该列。所以你也需要一个BEFORE UPDATE触发器。

在首先修复基表中的数据和约束之后,在客户端代码中处理此问题也有很好的方法。客户端代码可以在会话期间要求值,可以将其用作当前值,或者可以记住所使用的最后一个值,并将其插入用户界面(可能会用不同值覆盖)。您可以将当前值存储在cookie中。很多方面。

+0

我不使用我现在可以使用的设计。最后的建议听起来像是一个很好的解决方案,如果我能解决它,我会选择。 – Thomas

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

'TOP N'是非标准的(提示:'MAX')。 – onedaywhen

+0

@onedaywhen谢谢你的提示。我不知道我在想什么:) –

+0

很好的答案,谢谢,但它不会接受'从type_ty t'选择'max(t.name_of_colum),即使它是一个整数。我想这样的:'选择 stamdata_sd.id_sd AS id_sd, COALESCE(stamdata_sd.Type_sd, 选择最大(从lutbunke lutbunke.id))AS Type_sd 从stamdata_sd'我得到错误号1064,这心不是帮助我的人。 – Thomas

0

所以,当我在查询中做出新的纪录,本场type_sd是充满在type_ty表最新instans汽车 。

看来你想要的INSERT语句从其他表抢一个特定的值:

   insert into ZOO(animal) 
       values 
       ({the most recently added animal in the ANIMALS table}) 

的一种方式抢最近添加的行中的表使用TIMESTAMP列,其中当行被插入时用对应于“现在”的值更新:

   create table ANIMALS(id integer primary key autoincrement, 
         animal text, creationdate timestamp) 

NB数据库如何处理时间戳各不相同,因此将上面的内容视为伪代码。

   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) 
+0

非常感谢,很棒的答案像魅力一样工作。 – Thomas