SQL: Как скопировать строку в той же таблице, обновив одно из полей БЕЗ перечисления всех полей - PullRequest
1 голос
/ 03 января 2011

Hello Я искал ответ на этот вопрос, но не нашел здесь. Я использую Access 2010. По сути, у меня есть таблица с отчетами, а отчеты имеют номер редакции. Я нашел ответ о том, как скопировать поля и обновить только одно из них, но это выглядит примерно так:

INSERT INTO reports (fieldA, fieldB, fieldC, revision, fieldD, fieldE)
SELECT  fieldA, fieldB, fieldC, 2, fieldD, fieldE
FROM reports
WHERE <somecondition to select which report to copy>

Дело в том, что у меня есть множество полей, поэтому я хотел бы что-то, что будет выглядеть примерно так:

INSERT INTO reports 
SELECT  *, revision=2
FROM reports
WHERE <somecondition to select which report to copy>

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

Заранее спасибо всем, кто может помочь:)

Ответы [ 2 ]

0 голосов
/ 03 января 2011

Я почти уверен, что вы не можете сделать это в MS Access или в любом другом варианте SQL. Что вы можете сделать, как вы, вероятно, уже знаете, это использовать хранимую процедуру (называемую хранимым запросом в Access), которая принимает ваш номер редакции и идентификатор отчета для копирования (или некоторые другие условия WHERE) в качестве аргументов. Таким образом, вам все равно придется указывать все поля, но вы делаете это только один раз и в своей базе данных, а не в своем коде. Пример здесь:

http://www.stardeveloper.com/articles/display.html?article=2001050101&page=1

НТН!

0 голосов
/ 03 января 2011

Я нашел интересную альтернативу в этом вопросе, используя временную таблицу Запись клона SQL с уникальным индексом

DROP TABLE #tmp_MyTable

SELECT * INTO #tmp_MyTable
FROM MyTable
WHERE MyIndentID = 165

ALTER TABLE #tmp_MyTable
DROP Column MyIndentID

INSERT INTO MyTable
SELECT * 
FROM #tmp_MyTable

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

Не решение, которое я ищу, а альтернативный способ.

EDIT:

Попробовал это решение безуспешно: VBA говорит мне что-то вроде «поля с несколькими значениями не допускаются инструкциями SELECT INTO (ошибка времени выполнения 3838)»

У меня есть и поле OLE, и поле вложения, которое, как я подозреваю, является причиной ошибки. Но мне нужно сохранить их ...: /

...