Использование JOIN в запросе в MS Access 2016 для полей в длинном текстовом формате - PullRequest
0 голосов
/ 02 мая 2018

У меня есть два запроса, которые почти идентичны. Единственное отличие - это формат полей, которые объединяются. Один работает, другой нет.

Запрос, который объединяет два поля 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). [Кажется очевидным, но не для всех.]

Однако, это НЕ всегда будет иметь место для меня и всех остальных. У кого-то может быть чистый текст, например. Таким образом, опять же, если вы знаете другое, более общее решение, пожалуйста, дайте мне знать, и я сделаю ваш ответ ответом на этот вопрос.

Спасибо!

1 Ответ

0 голосов
/ 02 мая 2018

Понял. Смотрите ниже общее решение. Для сопоставления строк используется StrComp(string1,string2)=0.

SELECT alarmlogwithstring2.TableIndex, alarmlogwithstring2.Date_Stamp, alarmlogwithstring2.Time_Stamp, alarmlogwithstring2.Tag_Name, alarmlogwithstring2.Tag_Value, ECLString.ErrorDescription
FROM alarmlogwithstring2 INNER JOIN ECLString ON StrComp(alarmlogwithstring2.[Tag_Value], ECLString.[Tag_Value]) = 0
ORDER BY alarmlogwithstring2.TableIndex;
...