简短背景:我有一个SQLite数据库,大小只有几个GB,而且还在增长。它包含一堆非常简单的表。每个表由64位整数主索引字段(TStamp)和值字段(Val)组成。字段TStamp实际上是日期时间的长整型表示。这些表的行数和内容类型有所不同,但这并不重要。主表(tbIndDate)包含完整的日期范围,与其他表具有相同的主索引(TStamp),并在其Val字段中保存人类可读的日期时间。例如,
主索引表,名为tbIndDate:
TStamp Val
634082688000000000 5/1/2010 0:00:00
634082691000000000 5/1/2010 0:05:00
634082694000000000 5/1/2010 0:10:00
634082697000000000 5/1/2010 0:15:00
etc etc
自动化标签6FI1.PV的示例表,名为tb6FI1%PV:
TStamp Val
634085793000000000 41.7
634085796000000000 42.83
634085799000000000 41.44
634085802000000000 40.43
634085805000000000 39.78
etc etc
将数据放入表中由一个小的vb.net程序处理,当一个新的自动化标记添加到捕获列表中时,程序使用自动化标记名称创建一个新表,并开始填充它。这一切都很有效。
行。我已经开始构建一个从数据库中获取数据的工具。它适用于内连接:
SELECT [tbIndDate].[Val] AS 'Timestamp',[tb6FI1%PV].[Val] AS '6FI1.PV',
[tb6FI34%PV].[Val] AS '6FI34.PV',[tb6AI32%PV].[Val] AS '6AI32.PV'
FROM [tbIndDate],[tb6FI1%PV],[tb6FI34%PV],[tb6AI32%PV]
WHERE [tbIndDate].[TStamp]=[tb6FI1%PV].[TStamp]
AND [tbIndDate].[TStamp]=[tb6FI34%PV].[TStamp]
AND [tbIndDate].[TStamp]=[tb6AI32%PV].[TStamp];
返回:
Timestamp 6FI1.PV 6FI34.PV 6AI32.PV
1/1/2013 0:00:00 42.4679 1.499 0.8439
1/1/2013 0:05:00 40.3628 1.5048 0.8435
1/1/2013 0:10:00 38.2652 1.5028 0.8436
1/1/2013 0:15:00 37.8582 1.5029 0.8436
耶! :)
我还得到了一些平均和时间间隔查询。
但是,因为标签数据并非对所有日期都可用,所以我想创建一个选项来列出主索引中的所有日期,即使某些标签表没有匹配的数据。
具有左外连接的SELECT查询,换句话说。每个人都知道。数据可能如下所示:
Timestamp 6FI1.PV 6FI34.PV 6AI32.PV
1/1/2013 0:00:00 42.4679 1.499 NULL
1/1/2013 0:05:00 40.3628 1.5048 NULL
1/1/2013 0:10:00 38.2652 NULL NULL
1/1/2013 0:15:00 37.8582 NULL 0.8436
麻烦的是,我尝试过的SQL都没有奏效。这是一个没有去的地方:
SELECT [tbIndDate].[Val] AS 'Timestamp',[tb6FI1%PV].[Val] AS '6FI1.PV',
[tb6FI34%PV].[Val] AS '6FI34.PV'
FROM [tbIndDate],[tb6FI1%PV],[tb6FI34%PV]
LEFT JOIN [tbIndDate] ON [tbIndDate].[TStamp]=[tb6FI1%PV].[TStamp]
LEFT JOIN [tbIndDate] ON [tbIndDate].[TStamp]=[tb6FI34%PV].[TStamp];
错误是“SQL错误或缺少数据库,模糊列名:tbIndDate.Val”
我尝试从几个示例中复制语法,但没有一个完全相同,我的尝试失败了。
我做的别名错了吗?方括号用于容纳表名中的特殊字符?我是一个完整的SQL初学者,所以不要反对这个建议。
答案 0 :(得分:1)
看起来问题是您尝试多次加入[tbIndDate]
。试试这个:
SELECT [tbIndDate].[Val] AS 'Timestamp',[tb6FI1%PV].[Val] AS '6FI1.PV',
[tb6FI34%PV].[Val] AS '6FI34.PV'
FROM [tbIndDate]
LEFT JOIN [tb6FI1%PV] ON [tbIndDate].[TStamp]=[tb6FI1%PV].[TStamp]
LEFT JOIN [tb6FI34%PV] ON [tbIndDate].[TStamp]=[tb6FI34%PV].[TStamp];