2011-09-07 57 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查询...