sqlite - 如何将列值转换为 Sqlite 中的行?

标签 sqlite

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

我在这样的 sqlite 查询中获得了值(value)..

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

最佳答案

哦,所以你被一个糟糕的数据库设计困住了,你不能改变它......这很糟糕。它应该被分成 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 无法优化 因为从没想过他们会处理这样的暴行。

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

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

而且您必须使用的表格可能与没有理智的"template"相关联。这就是为什么您必须编写无意义的查询才能获得有用的东西。请注意,我基本上可以猜测结果集的"template",
R1      R2   R3     R4
============================
Local   9   3:55   4:50
...

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

关于sqlite - 如何将列值转换为 Sqlite 中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15759136/

相关文章:

android - 无法执行此操作,因为在 Android 中复制多个文件时没有出现当前事务

java - 通过使用选项卡android studio而不是按钮滑动 View 将数据传递给另一个 fragment

android - 在 SQLite 中比较日期的问题

sqlite - 使用sqlite查找连续重复的数量

python - 同步本地和 Elastic Beanstalk 数据库?

ruby - 在Ruby中准备和执行SQLite语句

sqlite - 从联接或组中查找第一行

java - 尝试列出数据库条目时应用程序崩溃

android - SQLiteOpenHelper 类对上下文参数做了什么?

ios - 突然出现 undefined symbol (_sqlite3_mprintf)错误