2013-02-14 48 views
1

簡短背景:我有一個SQLite數據庫,幾GB的大小和增長。它包含一堆非常簡單的表格。每個表由一個64位整數主索引字段(TStamp)和一個值字段(Val)組成。字段TStamp實際上是一個日期時間的long-int表示。這些表的行數有很大的不同,有些可變的內容類型,但這並不重要。主表(tbIndDate)包含全部日期,與其他表具有相同的主索引(TStamp),並在其Val字段中保存可讀的日期時間。例如,在SQLite中左連接SQL遇到問題

主索引表,命名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 

耶! :)

我也找到了一些平均和時間間隔的查詢工作。

然而,由於標籤數據不都適用於所有日期,我想創建列出的主索引的所有日期即使一些標籤表沒有匹配數據的選項。

一個選擇查詢與左外連接,換句話說。大家都知道。數據可能如下所示:

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

歡迎堆棧溢出!這似乎是一個很好的問題,但這有點長,可能會讓一些回答者失望。我刪除了一些空白行,但也許有些關於已經工作的信息沒有必要,或者可以縮短? – ughoavgfhw 2013-02-14 03:59:13

+0

感謝您的歡迎 - 我編輯了一些冗長。不希望我的第一篇文章是那些「信息不足」的文章之一! - 唐 – 2013-02-14 11:15:01

回答

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]; 
+0

傑夫!這樣可行。我想每個引用的表都必須在FROM子句中列出;不是這樣!而且我錯誤地使用了LEFT JOIN。我會編寫代碼,並做更多的研究,以便更好地理解。 – 2013-02-14 11:24:56

+0

太棒了!很高興我能幫上忙。 – 2013-02-14 11:53:50