2016-03-03 31 views
1

我有兩個屬性表。如果一個表沒有價值從另一個表獲得它

Table1: App_conf 
prop_name 
prop_value 
prop_desc 

Table2: Client_conf 
client_id 
prop_name 
prop_value 
prop_desc 

我想編寫一個查詢,其中第一,我需要在Client_conf表檢查與特定prop_nameclient_id。如果在Client_conf表中沒有匹配的行,那麼我需要檢查App_conf表,其中prop_name

比如價值在App_conf表:在Client_conf表

'Max Amount Limit', '2000', 'Maximum amount' 
'Min Amount Limit', '200', 'Minimum amount' 

值:

'1','Max Amount Limit', '1500', 'Maximum amount' 

案例1:

prop_name = 'Max Amount Limit', client_id = '1' 

在這種情況下,我需要的價值1500從Client_conf表。

案例2:

prop_name = 'Min Amount Limit', client_id = '1' 

由於這是不存在的Client_conf表,我需要從App_conf表中的值,其結果將是200

我需要這樣做在具有最佳性能的單個查詢中。

我正在使用MS SQL。

回答

1

你可以離開加入client_conf表上app_conf表等你拿null S其中有合適的客戶端配置。使用​​3210可確保您獲得一些配置,其中客戶端的配置。如果優先存在:

SELECT a.prop_name, 
      a.prop_desc 
      COALESCE(c.prop_value, a.prop_value) AS prop_value, 
FROM  app_conf a 
LEFT JOIN client_conf c ON a.prop_name = c.prop_name AND 
      c.client_id = 'some id' 
WHERE  a.prop_name = 'some name' AND    
+0

這隻會在client_conf中存在記錄時返回一個prop_value,因爲您正在執行LEFT JOIN,但是希望在WHERE子句中爲client_id指定一個值。 – William

+1

好的@ @威廉,謝謝。將'client_id'條件移到它所屬的'join'子句中。 – Mureinik

+0

如果app_conf表中不存在「某個名稱」,則此查詢不會返回值。在這種情況下,我需要從client_conf表中獲取值。你能幫忙嗎? –

0

試試這個,

SELECT COALESCE(CC.prop_value, AC.prop_value) AS prop_value, 
FROM  app_conf AS AC LEFT OUTER JOIN 
       client_conf AS CC ON AC.prop_name = CC.prop_name 
WHERE  AC.prop_name = 'Min Amount Limit' AND 
      (CC.client_id = '1' OR CC.client_id IS NULL) 

。假定prop_name表之間的有效鏈接,而且是唯一的。

相關問題