К сожалению, мне приходится регулярно импортировать данные из Excel в базу данных. Таблица выглядит примерно так:
IssueID References
1234 DocID1<cr>DocID2<cr>DocID3
1235 DocID1
1236 DocID2
1237 DocID2<cr>DocID3
Список литературы - многострочное текстовое поле. Я пытаюсь создать таблицу Docs с отношением один-ко-многим к таблице Issue, а не с этими многострочными ссылками.
У меня определены следующие таблицы:
Проблема: IssueKey, IssueID, IssueFields
Документ: DocKey, DocID, DocRev, DocOwner и т. Д.
DocLink: LinkKey, DocKey, IssueKey
Поскольку это будет выполняться неоднократно, таблица Doc уже будет существовать с определенными DocID. Итак, я хочу сделать запрос или поиск кода VBA для каждого DocID в столбце «Ссылки» и добавить ссылку на основе IssueID, если она еще не существует.
Простой, верно?
Jeff
Разъяснения:
1) У меня был третий столбец под названием «Val1», чтобы показать, что были другие столбцы, но это, казалось, запутало проблему. На самом деле в исходной таблице есть много (от многих до самых игнорируемых) столбцов, но я забочусь только о двух выше.
2) Мне не нужно анализировать разделитель или что-то слишком параноидальное: References содержит один или несколько уникально определенных ссылочных номеров документов (хранящихся в виде текста). Таким образом, фильтр LIKE включает список IssueID в каждом конкретном случае.
3) Вот пример допустимого вывода:
IssueID References
1234 DocID1
1234 DocID2
1234 DocID3
1235 DocID1
1236 DocID2
1237 DocID2
1237 DocID3
Идеальное решение - исходная таблица Excel (вверху) и две эти таблицы:
IssueKey IssueID
1 1234
2 1235
3 1236
4 1237
DocKey DocID
1 DocID1
2 DocID2
3 DocID3
И заполнить / обновить таблицу ссылок:
LinkKey IssueKey DocKey
1 1 1
2 1 2
3 1 3
4 2 1
5 3 2
6 3 3
4) Вот пример того, что я ожидал от решения (создает № 3 выше). К сожалению, это приводит к сбою Access, поэтому я не могу сказать, правильный ли синтаксис (отредактированный, чтобы отразить имена полей выше).
SELECT Q1.IssueID, D1.DocID
FROM Docs AS D1, Issues AS Q1
WHERE Q1.IssueID IN
((SELECT Q2.IssueID from Issues AS Q2 where (Q2.References) Like D1.DocID));
5) На данный момент отказавшись от Access, в MySQL работает следующее:
SELECT Q1.IssueID, D1.DocID
FROM Docs AS D1, Issues AS Q1
WHERE Q1.IssueID IN
((SELECT Q2.IssueID from Issues AS Q2 where (Q2.References) Like '%DocID1%'));
Это работает, как я и ожидал - я получаю каждый IssueID со ссылкой на DocID1, повторяемый для каждого документа в таблице. С приведенными выше данными это будет выглядеть так:
IssueID References
1234 DocID1
1234 DocID2
1234 DocID3
1235 DocID1
1235 DocID2
1235 DocID3
Теперь я просто хочу заменить «% DocID1%» на «%» + D1.DocID + «%» - ограничив результаты теми идентификаторами документов, которые действительно совпадают. По какой-то причине я получаю ноль записей, когда я делаю это - я думаю, что у меня есть синтаксис для неправильной подстановки подстановочных знаков в коррелированном поле.
6) Следующее работает для предоставления # 3 выше в MySQL, но тот же запрос, переведенный для доступа, приводит к сбою:
SELECT Q1.IssueID, D1.DocID
FROM Docs AS D1, Issues AS Q1
WHERE Q1.IssueID IN
((SELECT Q2.IssueID from Issues AS Q2 where (Q2.References) Like
CONCAT('%',D1.DocID,'%')));
[при доступе становится ('' & D1.DocID & '')]
Вывод: доступ отстой