2017-02-10 5 views
0

Я встречаю странную проблему с INSERT INTO. Попытка выполнить следующий запрос:INSERT INTO Отсутствует синтаксис?

INSERT INTO Claims_temp (CLAIM_NO) 
SELECT CLAIM_NO AS CLAIM_FACT 
FROM CLAIMS 
WHERE CLAIM_NO LIKE "*-*" 
UNION 
SELECT "L" & CLAIM_NO AS CLAIM_FACT 
FROM CLAIMS 
WHERE CLAIM_NO NOT LIKE "*-*"; 

Я получаю эту ошибку: 'ошибка синтаксиса (отсутствующий оператор) в выражении запроса' CLAIM_NO LIKE "-" UNION SELECT "L" & CLAIM_NO КАК CLAIM_FACT ОТ ПРЕТЕНЗИЙ ГДЕ CLAIM_NO НЕ НРАВИТСЯ "-" '.

Если я удаляю строку INSERT INTO Claims_temp, запрос выполняется и дает правильные результаты. Я не вижу никаких синтаксических ошибок. Я также попытался указать таблицы, т. Е. Вместо использования CLAIM_NO я использую CLAIMS.CLAIM_NO в части выбора запроса.

+0

@GurV, я думаю, что в доступе '*' используется вместо ANSI '%' – HoneyBadger

+0

Спасибо за ответ. Эта проблема по-прежнему сохраняется с этими изменениями. Кроме того, результаты запроса неверны с оператором%, а не *. –

ответ

2

Это кажется странным подходом. Почему бы не просто сделать:

INSERT INTO Claims_temp (CLAIM_NO) 
    SELECT IIF(CLAIM_NO LIKE "*-*", CLAIM_NO, "L" & CLAIM_NO) AS CLAIM_FACT 
    FROM CLAIMS; 

Если может быть дубликатами (который UNION Удаляет), а затем использовать SELECT DISTINCT.

+0

Эй, это здорово! Извините за странный подход, я все еще довольно новичок в SQL, поэтому некоторые из синтаксиса мне не знакомы (например, IIF). –

1

Я думаю, что ответ Гордона правильный, но я хочу добавить дополнение, объясняющее почему.

Ошибка говорит о том, что синтаксический анализатор SQL не может понять смысл, но проблема, кажется, существует только там, где добавлена ​​строка вставки.

Это говорит о том, что синтаксический анализатор обрабатывает INSERT ... SELECT как синтаксис, отличный от SELECT, и поэтому UNION может не поддерживаться в нормальном конвейере.

Если это не сработает, попробуйте встроенный просмотр. Что-то наподобие:

INSERT INTO Claims_temp (CLAIM_NO) 
SELECT claim_fact FROM (
SELECT CLAIM_NO AS CLAIM_FACT 
FROM CLAIMS 
WHERE CLAIM_NO LIKE "*-*" 
UNION 
SELECT "L" & CLAIM_NO AS CLAIM_FACT 
FROM CLAIMS 
WHERE CLAIM_NO NOT LIKE "*-*") AS foo; 
+0

Спасибо. Я стараюсь избегать подзапросов как можно больше, потому что они имеют тенденцию нарушать доступ для меня. –

+0

Они также делают код трудным для чтения. Итак, ответ Гордона лучше. Но, надеюсь, это проливает некоторый свет на то, почему это происходит :-) –

+0

Определенно! Еще раз спасибо! –

Смежные вопросы