СОДЕРЖИТ использование таблицы ключевых слов - PullRequest
0 голосов
/ 28 декабря 2018

Я хотел бы создать запрос, который заполняет поле в одной таблице на основе поиска по ключевым словам (CONTAINS), ссылающегося на поле ключевого слова из другой таблицы.См. Примеры таблиц ниже:

tbl_Parts
+----+------+-------------+------+
| ID | Comp |    Desc     | Type |
+----+------+-------------+------+
|  1 |  112 | Brg, Ball   |      |
|  2 |  245 | Bearing, X  |      |
|  3 |  364 | Mtg Ring, 1 |      |
|  4 |  445 | Pump, 2x3   |      |
+----+------+-------------+------+

tbl_Ref
+----+---------+-------+
| ID | Keyword | Type  |
+----+---------+-------+
|  1 | Bearing | O     |
|  2 | Ring    | S     |
|  3 | Pump    | P     |
|  4 | Disc    | O     |
+----+---------+-------+

В частности, я хотел бы заполнить tbl_Parts.Type, используя tbl_Ref.Type WHERE tbl_Parts.Desc CONTAINS tbl_Ref.Keyword.

Однако я не смогнайти любые примеры функции CONTAIN, которая использует поле в качестве ссылки.Я бы предположил, что запрос будет выглядеть примерно так:

SELECT *
FROM (
SELECT tbl_Parts.Comp, tbl_Parts.Desc, tbl_Ref.Type AS tbl_Parts.Type 
FROM tbl_Ref, tbl_Parts 
WHERE tbl_Parts.Desc CONTAINS tbl_Ref.Keyword
) AS x;

Я знаю, что это далеко не правильно, но это все, что я могу придумать на данный момент.

Будут также случаигде tbl_Parts.Desc содержит несколько ключевых слов.В этом случае я хотел бы объединить все совпадения типов.Однако в настоящий момент эта функциональность не является приоритетной.

Следует отметить, что я могу выполнить это в поисковом запросе в рамках проекта tbl_Parts, отдельного запроса или запроса добавления.

Любой совет или предложение по этому поводу было бы замечательно, заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Поскольку в конечном итоге вы намереваетесь заполнить поле tbl_parts.type (предположительно с помощью запроса UPDATE) значением, полученным из запроса SELECT, вам, вероятно, потребуется использовать функцию агрегирования домена, такую ​​как DLookupчтобы получить соответствующее значение, иначе MS Access будет жаловаться, что запрос не будет обновляемым.

Для этого я бы предложил следующее:

update tbl_parts p
set p.type = dlookup("type", "tbl_ref", "'" & p.desc & "' like '*' & keyword & '*'")

Это, конечно, будет scupperedесли tbl_parts.desc содержит символы кавычек.

Пример:

enter image description here

enter image description here

После запуска выше SQL:

enter image description here

При условии, что описание соответствует нескольким ключевым словам, и вам нужно объединить несколько типовзатем в строку с разделителями-запятыми я бы предложил создать запрос SELECT с критериями выбора на основе критериев, показанных в выражении DLookup выше, а затем выполнить итерацию по набору записей результатов с использованием VBA.

0 голосов
/ 28 декабря 2018

CONTAINS требует строкового литерала в качестве второго аргумента, поэтому я сомневаюсь, что это возможно.

СОДЕРЖИТ (
{
column_name | (column_list))
| *
| PROPERTY ({имя_ столбца}, 'имя_свойства')
}
, '' [, LANGUAGE language_term]
)

Вместо этого можно использовать LIKE:

SELECT tbl_Parts.Comp, tbl_Parts.Desc, tbl_Ref.Type AS [tbl_Parts_Type] 
FROM tbl_Ref
JOIN tbl_Parts 
  ON tbl_Parts.Desc LIKE '%' +  tbl_Ref.Keyword + '%';

Также будут экземплярыгде tbl_Parts.Desc содержит несколько ключевых слов.В этом случае я хотел бы объединить все совпадения типов.Однако эта функциональность в настоящее время не является приоритетной.

SELECT tbl_parts.ID, tbl_Parts.Comp, tbl_Parts.Desc,
  STRING_AGG(tbl_Ref.Type, ',') WITHIN GROUP(ORDER BY tbl_Ref.ID) AS tbl_Parts_Type 
FROM tbl_Ref
JOIN tbl_Parts 
  ON tbl_Parts.Desc LIKE '%' +  tbl_Ref.Keyword + '%'
GROUP BY tbl_parts.ID, tbl_Parts.Comp, tbl_Parts.Desc;
...