2011-09-07 56 views
0

我有以下查詢,這很好。我遇到的問題是,在這兩個表(以及聚合聯合表)中,都有一個名爲MTGUID的字段。我需要將MTGUID乘以一個數字(比方說1.35,以方便使用),並讓它在MTGUID字段中返回該數字。我已經嘗試了十幾種方法來做到這一點,並不能得到任何東西來玩球。我可以爲每個計算的價格創建一個新列,例如(BKRETAIL.MTGUID * 1.35)AS MTG1,但我們有成千上萬的專門使用MTGUID的代碼行。有任何想法嗎?從SQL查詢計算字段從多個表中選擇與聯盟

我正在使用Firebird SQL。

SELECT * FROM ( 
SELECT BKRETAIL.* FROM BKRETAIL WHERE BKRETAIL.MKEY='SOMEKEY' 
UNION SELECT BKWHOLESALE.* FROM BKWHOLESALE WHERE MKEY='SOMEKEY') 
ORDER BY 
case STATUS  
WHEN 'RT' then 1  
WHEN 'WH' then 2  
WHEN 'OL' then 3  
WHEN 'OD' then 4  
WHEN NULL then 5  
else 6 
end; 

回答

1

如何:

SELECT MTGUID * 1.35 as calculatedMTGUID, SUBSEL.* FROM ( 
SELECT BKRETAIL.* FROM BKRETAIL WHERE BKRETAIL.MKEY='SOMEKEY' 
UNION SELECT BKWHOLESALE.* FROM BKWHOLESALE WHERE MKEY='SOMEKEY') SUBSEL 
ORDER BY 
case STATUS  
WHEN 'RT' then 1  
WHEN 'WH' then 2  
WHEN 'OL' then 3  
WHEN 'OD' then 4  
WHEN NULL then 5  
else 6 
end; 
0

試試這個

SELECT MTGUID * 1.35 AS MTGUID,<list rest OF COLUMNS here> 
FROM ( 
SELECT BKRETAIL.* FROM BKRETAIL WHERE BKRETAIL.MKEY='SOMEKEY' 
UNION SELECT BKWHOLESALE.* FROM BKWHOLESALE WHERE MKEY='SOMEKEY') 
ORDER BY 
case STATUS  
WHEN 'RT' then 1  
WHEN 'WH' then 2  
WHEN 'OL' then 3  
WHEN 'OD' then 4  
WHEN NULL then 5  
else 6 
end; 
+0

但問題是,有幾百列,而那些可能會有改變遲早。有其他選擇嗎? – Cyprus106

0

一種選擇是用計算機來替換原來的MTGUID列,即

  • 重命名原始表(s)中的列;
  • 使用COMPUTED BY (expr)添加具有所需表達式的新MTGUID列;

這樣做的好處是你不必改變你的SQL語句,缺點是你必須在很多地方(所有有表格的列)維護表達式。當然,需要使用原始MTGUID值的查詢必須更新爲使用重命名的列,但如果這些語句的數量明顯較少,則可能會帶來麻煩。

我想一個更好的解決辦法是「隱藏」視圖背後所有這些東西,但是這需要提醒您的SQL查詢...