从SQL查询计算字段从具有Union的多个表中进行选择

时间:2011-09-07 16:03:14

标签: sql firebird firebird2.5

我有以下查询,效果很好。我遇到的问题是,在两个表(和聚合的联合表)中,都有一个名为MTGUID的字段。我需要将MTGUID乘以一个数字(比如1.35,为了便于使用)并让它在MTGUID字段中返回该数字。我已经尝试了十几种方法来做到这一点并且无法得到任何东西来打球。我可以为每个计算出的价格创建一个新列,例如(BKRETAIL.MTGUID * 1.35)AS MTG1,但是我们有成千上万行专门使用MTGUID的代码。有什么想法吗?

我正在使用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; 

3 个答案:

答案 0 :(得分: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; 

答案 1 :(得分: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; 

答案 2 :(得分:0)

一种选择是将原始MTGUID列替换为计算值,即

  • 重命名表格中的原始MTGUID列;
  • 使用MTGUID;
  • 添加包含所需表达式的新COMPUTED BY (expr)

这样做的好处是您不必更改SQL语句,缺点是您必须在许多地方维护表达式(所有具有该列的表)。当然,必须更新需要原始MTGUID值的查询才能使用重命名的列,但如果此类语句的数量明显较低,则可能是值得的。

我认为更好的解决方案是“隐藏”视图背后的所有内容,但这需要提醒您的SQL查询......