簡體   English   中英

如何將結果集中的單行表示為多行?

[英]How can I represent a single row from result set as multiple rows?

例如,給定具有這些列的貨幣匯率表(此處使用3,但在我的情況下大約為30):

  date     | eur | usd | gbp
2010-01-28 | X   | Y   | Z

如何將其轉換為該日期(使用具有最新日期的行):

currency | rate
eur      | X
usd      | Y
gbp      | Z

我提出了這樣的查詢:

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
...

它又大又丑。 還有其他解決方案嗎?

有時,最簡單的解決方案(如果您需要美觀的查詢)是重新設計架構。 最好的解決方案很可能是將表更改為:

   date    | currency | rate
-----------+----------+-----
2010-01-28 |   eur    |  X
2010-01-28 |   usd    |  Y
2010-01-28 |   gbp    |  Z

在日期和貨幣上具有適當的索引以提高效果。 這是3NF中應該采用的方式,因為速率相互依賴,這違反了3NF規則:

每列都必須取決於鍵,整個鍵,而僅取決於鍵,所以請幫助我Codd。

(我喜歡那個小東西)。 另一種選擇是提供一個執行相同操作的視圖,然后查詢該視圖。 對於DBMS來說,這同樣重要,但是您的查詢至少看起來更漂亮(盡管create view仍然看起來很丑)。

或者,您也可以接受以下事實:有些查詢看起來很丑陋,可以很好地記錄下來,然后繼續進行:-)

您必須在SQL中執行此操作嗎?

使用編程語言,這很簡單。

在PHP中:

$q = mysql_query("
  SELECT    eur, usd, gbp
  FROM      rates
  ORDER BY  date DESC 
  LIMIT 1
");

$table = false;
if($val = mysql_fetch_array($q, MYSQL_ASSOC))
{
  $table = array(
    'eur' => $val['eur'],
    'usd' => $val['usd'],
    'gbp' => $val['gbp'],
  );
}
echo "currency | rate\n";
echo "-----------------";
foreach($table as $cur => $rate)
  echo $curr."      | ".$rate."\n";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM