在SQLite中使用左连接SQL时遇到问题

时间:2013-02-14 03:33:29

标签: sql sqlite

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

1 个答案:

答案 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];