【问题标题】:Oracle SQL -- Grabbing values from multiple rowsOracle SQL——从多行中获取值
【发布时间】:2012-05-06 18:09:33
【问题描述】:

我有一张这样的桌子:

TABLE: FACTS
ID       KEY         VALUE
1        name        Jeremy
1        height      5'11
1        awesomeness 10
2        name        Mark
2        awesomeness 4
3        height      4'6

因此,(ID,KEY) 元组可以被视为主键。

我正在尝试返回这样的行:

ID     NAME     HEIGHT    AWESOMENESS
1      Jeremy   5'11      10
2      Mark     (null)    4
3      (null)   4'6       (null)

除了对每一列进行子选择之外,如何获取键值(如果它们存在)并将它们收集到我的单行中?到目前为止我尝试的是:

SELECT 
  id,
  CASE WHEN facts.key = 'name' THEN value END name,
  CASE WHEN facts.key = 'height' THEN value END height,
  CASE when facts.key = 'awesomeness' THEN value END awesomeness
FROM
  facts
WHERE
  facts.id in (1,2,3)

但由于显而易见的原因,这会为每个匹配的键返回一行,而不是每个 id 一行。

我怎样才能以我想要的方式得到这个?

谢谢!

【问题讨论】:

    标签: sql oracle pivot dynamic-sql


    【解决方案1】:

    您可以在任何版本的 Oracle 中像这样对数据进行透视。

    SELECT id,
           MAX( CASE WHEN key = 'name' THEN value ELSE null END ) name,
           MAX( CASE WHEN key = 'height' THEN value ELSE null END ) height,
           MAX( CASE WHEN key = 'awesomeness' THEN value ELSE null END ) awesomeness
      FROM facts
     WHERE id IN (1,2,3)
     GROUP BY id
    

    如果您使用的是 11g,您还可以使用 PVOT 运算符。

    但是,如果这是您的数据模型的代表,那么这种实体属性数据模型通常会相当低效。通常使用包含name、height、awesomeness 等列的表格会更好。

    【讨论】:

    • 比我早 10 秒,并且同一个查询的版本稍微简洁一些:/
    • 这很棒,而且效果很好,但我不明白。这里的逻辑是什么?为什么是 max,而不是 min? (P.S. 这个表支持一个用户可以创建任意键的系统,所以有必要让它得到这样的支持)
    • @Jeremy - 如果存在多行,则任何返回非 NULL 值的聚合函数只要其中一个为非 NULL 就足够了。 MIN 应该也能正常工作——选择 MAX
    猜你喜欢
    • 1970-01-01
    • 2015-03-28
    • 2021-10-14
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多