2013-02-14 3 views
1

Короткий фон: у меня есть база данных SQLite, имеющая несколько гб и растущая. Он содержит кучу очень простых таблиц. Каждая таблица состоит из 64-битного целочисленного первичного поля индекса (TStamp) и поля значений (Val). Поле TStamp на самом деле представляет собой long-int представление даты-времени. В таблицах широко варьируются числа строк и несколько переменных типов контента, но это не имеет значения. Мастер-таблица (tbIndDate) содержит полный диапазон дат, имеет тот же первичный индекс (TStamp), что и другие таблицы, и сохраняет человеко-читаемые дату-время в своем поле Val. Например,Возникли проблемы с левым соединением SQL в SQLite

Мастер индекс таблицы, названный 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, и когда новый новый тег автоматизации добавляется в список захвата, программа создает новую таблицу с использованием имени тега автоматизации и начинает ее заполнять. Это все работает реально.

OK. Я начал создавать инструмент для получения данных из базы данных. Он отлично работает для внутренних соединений:

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 

Yay! :)

Я также получил некоторые запросы усреднения и интервала времени.

Однако, поскольку данные тегов недоступны для всех дат, я хотел бы создать опцию для отображения всех дат в главном индексе, даже если некоторые таблицы тегов не имеют соответствующих данных.

Запрос 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

Добро пожаловать в Переполнение стека! Это похоже на хороший вопрос, но он немного длинный, что может отвратить некоторых ответчиков. Я удалил несколько пустых строк, но, возможно, какая-то информация о том, что уже работает, не нужна или может быть сокращена? – ughoavgfhw

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

Джефф! Это работает.Я думал, что каждая указанная таблица должна быть указана в предложении FROM; не так! И я неправильно использовал LEFT JOIN. Я закодирую его и сделаю еще несколько исследований, чтобы лучше понять. –

+0

Отлично! Рад, что смог помочь. –

Смежные вопросы