如何在Sqlite中将列值转换为行?

时间:2013-04-02 08:10:21

标签: sqlite

我在sqlite中有一个表值,如..

我在这样的sqlite查询中获得了价值..

select * from tablename where id='101' and id='102' and id='1' and id='18'

101 Local Local Local   Local   Local   Local
102 9               12      9       12      9
  1 3:55    4:20    4:40    5:00    5:20    5:40
 18 4:50    5:15    5:35    5:55    6:15    6:35

以上值我需要转换为sqlite查询,如下所示..

Local       9       3:55    4:50
Local       12      4:20    5:15
Local       9       4:40    5:35
Local       12      5:00    5:55
Local       9       5:20    6:15
Local       9       5:40    6:35

1 个答案:

答案 0 :(得分:2)

哦,所以你遇到了一个糟糕的数据库设计,你不能改变......那很糟糕。它应该分为4个表(至少)。无论如何,在这种特殊情况下,这是一种方法。

我假设第一个查询等同于:

SELECT id, F1, F2, F3, F4, F5, F6
FROM tablename
WHERE id IN (101,102,1,18)

所以,您可以进行转置/旋转/实际调用的任何内容:

SELECT 
  MAX(CASE WHEN id=101 THEN F1 END) R1,
  MAX(CASE WHEN id=102 THEN F1 END) R2,
  MAX(CASE WHEN id=1 THEN F1 END) R3,
  MAX(CASE WHEN id=18 THEN F1 END) R4
FROM tablename
UNION
SELECT 
  MAX(CASE WHEN id=101 THEN F2 END) R1,
  MAX(CASE WHEN id=102 THEN F2 END) R2,
  MAX(CASE WHEN id=1 THEN F2 END) R3,
  MAX(CASE WHEN id=18 THEN F2 END) R4
FROM tablename
UNION
SELECT 
  MAX(CASE WHEN id=101 THEN F3 END) R1,
  MAX(CASE WHEN id=102 THEN F3 END) R2,
  MAX(CASE WHEN id=1 THEN F3 END) R3,
  MAX(CASE WHEN id=18 THEN F3 END) R4
FROM tablename
UNION
SELECT 
  MAX(CASE WHEN id=101 THEN F4 END) R1,
  MAX(CASE WHEN id=102 THEN F4 END) R2,
  MAX(CASE WHEN id=1 THEN F4 END) R3,
  MAX(CASE WHEN id=18 THEN F4 END) R4
FROM tablename
UNION
SELECT 
  MAX(CASE WHEN id=101 THEN F5 END) R1,
  MAX(CASE WHEN id=102 THEN F5 END) R2,
  MAX(CASE WHEN id=1 THEN F5 END) R3,
  MAX(CASE WHEN id=18 THEN F5 END) R4
FROM tablename
UNION
SELECT 
  MAX(CASE WHEN id=101 THEN F6 END) R1,
  MAX(CASE WHEN id=102 THEN F6 END) R2,
  MAX(CASE WHEN id=1 THEN F6 END) R3,
  MAX(CASE WHEN id=18 THEN F6 END) R4
FROM tablename

不幸的是,它以一种奇怪的方式排序。

我真的建议你说服负责人重新设计数据库。一些设计人员认为拥有这种结构的表是“灵活的”和“提高性能”,但事实并非如此:对这些表进行实际工作需要高度重要的查询,大多数DBMS 无法优化< / em> 因为他们从未被期望处理过这样的暴行。

这样的表也打破了关系模型的想法。每个表必须具有一个语句“模板”,例如,CREATE TABLE S (id INTEGER, name TEXT, address TEXT)可以具有模板“具有ID ID的供应商称为NAME并且位于ADDRESS”。现在,当您将其内容放入模板时,此表中的每一行都会为您提供关于世界的真实陈述:如果S包含行(1, "Bob & Co.", "Lime St., 125"),那么它将会告诉你“ID为1的供应商名为Bob&amp; Co.,位于Lime St.,125”。

所有关系操作:选择,投影,连接,过滤等不仅仅以特定的方式组合表,不!它们还结合了“模板”,因此您可以说明查询为您提供的确切信息。反之亦然,如果您可以通过组合这些“模板”来表达您想要的信息,它几乎会自动为您提供相应的查询。

您必须使用的表格可以与没有理智的“模板”相关联。这就是为什么你必须编写无意义的查询以获得有用的东西。请注意,我基本上可以猜测结果集的“模板”,

R1      R2   R3     R4
============================
Local   9   3:55   4:50
...

类似于“R2类型的事件发生在R1处,从时间R3开始到R4时结束”。我是对的吗?