例如,给出了具有这些列的货币汇率表(在这里使用3,但在我的情况下,大约有30个):
date | eur | usd | gbp
2010-01-28 | X | Y | Z
Run Code Online (Sandbox Code Playgroud)
如何将其转换为此(使用具有最新日期的行):
currency | rate
eur | X
usd | Y
gbp | Z
Run Code Online (Sandbox Code Playgroud)
我想出了这样的查询:
SELECT 'eur' AS currency, eur AS rate FROM rates WHERE date = (SELECT MAX(date) FROM rates)
UNION
SELECT 'usd' AS currency, usd AS rate FROM rates WHERE date = (SELECT MAX(date) FROM rates)
UNION
...
Run Code Online (Sandbox Code Playgroud)
这是巨大而丑陋的.还有其他解决方案吗?
有时最简单的解决方案(如果您需要漂亮的查询)是重新设计架构.可能最好的解决方案是将您的表格更改为:
date | currency | rate
-----------+----------+-----
2010-01-28 | eur | X
2010-01-28 | usd | Y
2010-01-28 | gbp | Z
Run Code Online (Sandbox Code Playgroud)
具有合适的日期和货币指数以表现.由于费率相互依赖,违反3NF规则,因此它应该在3NF中应该是这样的:
每一栏都必须依靠钥匙,整个钥匙和钥匙,所以请帮助我Codd.
(我喜欢那个小曲子).另一种方法是提供一个视图,它执行相同的操作,然后查询视图.这对于DBMS来说同样重要,但你的查询至少看起来更漂亮(create view尽管看起来仍然看起来很丑陋).
或者你可以接受这样一个事实:一些查询看起来很难看,记录得很好,继续前进:-)
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |