1

简短背景:我有一个 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 初学者,所以不要拒绝建议。

4

1 回答 1

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];
于 2013-02-14T03:39:43.260 回答