2011-09-23 103 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