У меня есть два запроса, которые почти идентичны. Единственное отличие - это формат полей, которые объединяются. Один работает, другой нет.
Запрос, который объединяет два поля Integer, работает отлично.
Запрос, который СОЕДИНЯЕТ два полных текстовых поля, выдает следующую ошибку:
"Невозможно присоединиться к объекту Memo, OLE или гиперссылке (alarmlogwithstring2. [Tag_Value] = ECLString. [Tag_Value])."
Функциональный запрос:
SELECT alarmlogwithdescs.TableIndex, alarmlogwithdescs.Date_Stamp, alarmlogwithdescs.Time_Stamp, alarmlogwithdescs.Tag_Name, alarmlogwithdescs.Tag_Value, ErrorCodeLookup.ErrorDescription
FROM ErrorCodeLookup INNER JOIN alarmlogwithdescs ON ErrorCodeLookup.[Tag_Value] = alarmlogwithdescs.[Tag_Value]
ORDER BY alarmlogwithdescs.TableIndex;
Нефункциональный запрос:
SELECT alarmlogwithstring2.TableIndex, alarmlogwithstring2.Date_Stamp, alarmlogwithstring2.Time_Stamp, alarmlogwithstring2.Tag_Value, ECLString.ErrorDescription
FROM alarmlogwithstring2 INNER JOIN ECLString ON alarmlogwithstring2.[Tag_Value] = ECLString.[Tag_Value]
ORDER BY alarmlogwithstring2.TableIndex;
Что я пробовал:
1.) Я поменял таблицу, следующую за «FROM», на ECLString со всеми необходимыми изменениями, которые должны последовать. (То есть после INNER JOIN я изменил ECLString на alarmlogwithstring2 и т. д.). Это делает два запроса более идентичными, но не должно влиять на результат. Я сделал то же самое для функционального запроса, просто чтобы быть уверенным. Функциональный еще работал, а нефункциональный еще не ...
2.) Я попытался создать в поле поиска Tag_Value поле Short Text, сохраняя поле Tag_Value реальной таблицы данных Long Text. Нет эффекта.
3.) Я пытался изменить тип JOIN при создании связи между двумя таблицами. Нет эффекта.
4.) Изменено alarmlogwithstring2.[Tag_Value]=ECLString.[Tag_Value]
на CAST(alarmlogwithstring2.[Tag_Value] AS varchar(max)) = CAST(ECLString.[Tag_Value] AS varchar(max))
и получите следующую ошибку:
"Синтаксическая ошибка (отсутствует оператор) в выражении запроса CAST (alarmlogwithstring2. [Tag_Value] AS varchar (max)) = CAST (ECLString. [Tag_Value] AS varchar (max))."
По какой-либо причине после нажатия «Ок», чтобы закрыть сообщение об ошибке, запятая, следующая за SELECT alarmlogwithstring2.TableIndex,
, подсвечивается, указывая на то, что пропавший оператор находится там. Хорошо?
Любая помощь будет принята с благодарностью. Спасибо за ваше время!
Понял! Работает для моей ситуации, по крайней мере. Любой другой метод для этого все еще будет оценен.
Это работает для меня, потому что мое поле Tag_Value содержит текст, такой как «Error0, Error1, Error2» и т. Д. *
Итак, я использовал следующий код:
SELECT alarmlogwithstring2.TableIndex, alarmlogwithstring2.Date_Stamp, alarmlogwithstring2.Time_Stamp, alarmlogwithstring2.Tag_Value, ECLString.ErrorDescription
FROM alarmlogwithstring2 INNER JOIN ECLString ON Right( alarmlogwithstring2.[Tag_Value] , 1) = Right(ECLString.[Tag_Value], 1)
ORDER BY alarmlogwithstring2.TableIndex;
Это работает из-за целого числа в конце моего текста Tag_Value. При использовании функции Right (строка, длина) сравниваются только целые числа в каждом значении, поскольку все они находятся справа от значения.
Если ваша ситуация похожа на мою, то приведенный выше код подходит; однако, если число ваших кодов ошибок (или что-то еще) попадет в двойные цифры, обязательно отразите это в полях обеих таблиц. (т. е. сделать Error0 => Error00, сделать Error1 => Error01 и т. д.) в обеих таблицах и использовать Right (строка, 2) вместо Right (строка, 1). [Кажется очевидным, но не для всех.]
Однако, это НЕ всегда будет иметь место для меня и всех остальных. У кого-то может быть чистый текст, например. Таким образом, опять же, если вы знаете другое, более общее решение, пожалуйста, дайте мне знать, и я сделаю ваш ответ ответом на этот вопрос.
Спасибо!