Почему добавление конкатенации нарушает этот SQL-запрос MS ACCESS? - PullRequest
1 голос
/ 14 сентября 2011

Вот эта таблица

O (for origin): | PText | CText |
P (products):     | id | PText | ... |
C (category):     | id | CText | .... |
D (destination):  | pid | cid |

Что мне нужно сделать, так это найти идентификаторы продуктов с использованием O PText и идентификаторы категорий с помощью CTexts O и поместить эти идентификаторы в D

Этот запрос делает именно это:

INSERT INTO D ( pid, cid )
SELECT P.id, C.id
FROM (O INNER JOIN P ON O.PText = P.PText) INNER JOIN C ON C.CText = O.CText
WHERE P.id IS NOT NULL AND C.id IS NOT NULL AND P.id NOT IN (SELECT pid FROM D);

Проблема в том, что у О есть несколько ошибок. На всех PTexts отсутствует «0» (Microsoft решила убрать его, когда брала данные из таблицы Access и помещала их в электронную таблицу Excel). Следовательно, PText не соответствует, но "0" + PText соответствует.

Вот моя вторая попытка:

INSERT INTO D ( pid, cid )
SELECT P.id, C.id
FROM (O INNER JOIN P ON **"0" &** O.PText = P.PText) INNER JOIN C ON C.CText = O.CText
WHERE P.id IS NOT NULL AND C.id IS NOT NULL AND P.id NOT IN (SELECT pid FROM D);

Этот второй запрос не работает. Там написано Вы собираетесь обновить 0 строк. Мой вопрос: как второй запрос может не работать, когда первый?

Примечание: используется MS ACCESS 2002

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

Оба запроса, вероятно, работают.Второй просто не находит строк для обновления.Вероятно, причина в том, что когда вы массируете поле O.TEXT, добавив к нему начальный символ «0», INNER JOIN не сможет найти ни одной записи в M.

Попробуйте запрос:

 SELECT M.id, C.id FROM (O INNER JOIN M ON "0" & O.PText = M.PText)

Возвращает ли он записи?Если нет, то это ваша проблема.

Попробуйте:

 SELECT M.PText, C.PText FROM (O INNER JOIN M ON O.PText = M.PText)

Что возвращается?(Я не уверен, что следил за изменениями, которые вы внесли в имена столбцов, возможно, вам придется изменить их перед выполнением запроса).

0 голосов
/ 14 сентября 2011

Число, вероятно, числовое поле, поэтому начальный ноль удаляется. Конкат сделает его текстовым полем, и вы не сможете присоединить текст к числовому столбцу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...