基于第二个表的动态查询

时间:2013-07-05 22:18:18

标签: sqlite

我有一个多个符号的报价表

表格引用

ID INT

SYMBOL NVARCHAR(6)

DT DATETIME

PRICE DECIMAL(18,5)

表TempSymbol

SYMBOL NVARCHAR(6)

我想只从QUOTES中提取那些符号也在临时表中的符号,这些符号可能会根据用户请求而变化

Create TABLE TempSymbol
(
   SYMBOL NVARCHAR(6)      NOT NULL
);
INSERT INTO TempSymbol(SYMBOL) VALUES ('MSFT');
INSERT INTO TempSymbol(SYMBOL) VALUES ('INTC');
INSERT INTO TempSymbol(SYMBOL) VALUES ('AAPL');

我想要一个将从QUOTES返回以下数据的查询...

datetime symbol1 | price1 | symbol2 | price2 | symbol3 | price3


2012-11-12 12:10:00 MSFT | 12.10 | INTC | 5.68 | AAPL | 16.89

2012-11-12 12:15:00 MSFT | 12.22 | INTC | 5.97 | AAPL | 16.22

...

...

...

SELECT DT, SYMBOL, PRICE FROM QUOTE AS Q INNER JOIN TempSymbol AS TS ON Q.SYMBOL = TS.SYMBOL

这会返回我需要转移但是在SQLite中不可用的记录是否有另一种方法我应该尝试这个?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

SQL正在解决您设计的问题:检索数据。您可以添加ORDER BY DT来创建相邻日期时间的记录。

如果你仔细考虑一下,你会发现SELECT无法回复你想要的东西。它返回表行,SQL表行具有恒定长度。所以做你所谓的" pivot"不是SELECT操作。您可能正在考虑电子表格中的支点。数据库不是电子表格。

之后,生成所需的报告最好使用带有SQLite接口的任何语言的小程序(在Android中,例如Java;否则为C或TCL)。进行查询。将行作为哈希,数组或ODM记录返回。其余的是对这些数据的几个循环。算法是:

last_dt = null
for row in all rows
  if row.dt != last_dt
    start new output line
    print dt
    last_dt = dt
  end
  print ' | ', row.symbol, ' | ', row.price
end

另一个注意事项:使用高级数据库功能(如存储过程和XML对象),您可以在SQL中实现此功能。 XML对象可以包含可变数量的字段。这里的限制是SQLite,它没有提供这些功能。

答案 1 :(得分:0)

试试这个

SELECT DT, SYMBOL, PRICE FROM QUOTE where SYMBOL in (Select SYMBOL from TempSymbol)