У меня есть два запроса, которые почти идентичны. Единственное отличие - это формат объединяемых полей. Один работает, другой нет.
Запрос, который объединяет два целочисленных поля, работает отлично.
Запрос, который объединяет два длинных текстовых поля, выдает следующую ошибку: «Невозможно присоединиться к объекту 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 со всеми необходимыми изменениями, которые должны последовать. (т.е. затем, после ВНУТРЕННЕГО СОЕДИНЕНИЯ, я изменил ECLString на alarmlogwithstring2 и т. д.). Это делает два запроса более идентичными, но не должно влиять на результат. На всякий случай я сделал то же самое для функционального запроса. Функциональный по-прежнему работал, а нефункциональный - нет ...
2.) Я попытался сделать поле Tag_Value моей таблицы поиска кратким текстом, сохранив при этом поле Tag_Value реальной таблицы данных как длинный текст. Нет эффекта.
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 (string, length) сравниваются только целые числа в каждом значении, поскольку все они находятся справа от значения.
Если ваша ситуация похожа на мою, то код выше в порядке; однако, если ваше количество кодов ошибок (или что-то еще) выражается в двузначных цифрах, обязательно отразите это в полях обеих таблиц. (т.е. сделать Error0 => Error00, сделать Error1 => Error01 и т. д.) в обеих таблицах и использовать Right (строка, 2) вместо Right (строка, 1). [Кажется очевидным, но не для всех.]
Однако это НЕ всегда будет так для меня и всех остальных. У кого-то может быть чистый текст, например. Таким образом, опять же, если вы знаете другое, более общее решение, пожалуйста, дайте мне знать, и я дам вам ответ на этот вопрос.
Спасибо!
Понятно. См. Ниже общее решение. Он использует 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;