1

短い背景:私はSQLiteデータベースを持っており、サイズが数GBで、大きくなっています。非常に単純なテーブルがたくさん含まれています。各テーブルは、64ビット整数のプライマリインデックスフィールド(TStamp)と値フィールド(Val)で構成されています。フィールドTStampは、実際には日時のlong-int表現です。テーブルの行数は大きく異なり、コンテンツタイプも多少異なりますが、それは問題ではありません。マスターテーブル(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

tb6FI1%PVという名前の自動化タグ6FI1.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 に答える