2010-06-07 5 views
0

У меня есть 2 таблицы в доступерешения для обновления таблицы на основе данных из другой таблицы

это то, что мне нужно:

1. if the PK from table1 exists in table2, then delete the entire record with that PK from table2 and add the entire record from table1 into table2 
2. if the PK does not exist then add the record 

мне нужна помощь как с заявлением SQL и VBA

Я думаю, что VBA должен быть петлей, проходящей через каждую запись в таблице1. внутри цикла i должен иметь оператор выбора

+0

Я отправил ответ на Ваш предыдущий вопрос: http://stackoverflow.com/questions/2992138/docmd-transfertext-to-update-data/2992289#2992289 – Fionnuala

+0

пожалуйста, смотрите мой ccomment на это –

ответ

1

Я не думаю, что вам нужен цикл VBA, всего два оператора SQL.

Сначала удалите соответствующие строки из таблицы2.

DELETE 
FROM table2 AS m 
WHERE pk IN (SELECT pk FROM table1); 

Затем добавьте все строки из таблицы1 в таблицу2.

INSERT INTO table2 (
    pk, 
    field2, 
    field3, 
    field4) 
SELECT 
    i.pk, 
    i.field2, 
    i.field3, 
    i.field4 
FROM 
    table1 AS i; 
+1

Вы должны изменить ' WHERE' в вашем заявлении 'DELETE', чтобы проверить, находится ли файл p2 таблицы в списке, или ограничить внутренний запрос только возвратом строк, где соответствует pk. – VeeArr

+0

@VeeArr Спасибо. Вместо того, чтобы пересматривать ошибочные EXISTS, я перешел в IN. – HansUp

1

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

Dim oDB As DAO.Database 
Dim sSQL As String 
Dim oQry As DAO.QueryDef 

Set oDB = DBEngine.Workspaces(0).Databases(0) 
sSQL = "Delete From Table2 Where Exists(Select 1 From Table1 Where Table1.Id = Table2.Id)" 
oDB.Execute sSQL, dbFailOnError 

sSQL = "PARAMETERS [Col1Param] Text, [Col2Param] Text, [Col2Param] Text; " & _ 
    "Insert Into Table1(Col1, Col2, Col3) Values([Col1Param], [Col2Param], [Col3Param])" 
Set oQry = oDB.CreateQueryDef("", sSQL) 
oQry!Col1Param = "Col1Value" 
oQry!Col2Param = "Col2Value" 
oQry!Col3Param = "Col3Value" 
oQry.Execute, dbFailOnError 

oQry.Close 

Set oQry = Nothing 
Set oDB = Nothing 
1
DELETE FROM table2 
    WHERE EXISTS 
    (SELECT * FROM table1, table2 
    WHERE table1.pk=table2.pk); 

INSERT INTO table2 
SELECT * FROM table1; 

Это предполагает table1 и table2 имеют одинаковые столбцы.

+0

круто, что вам не нравится в решении hansup? –

+0

Как написано, он должен удалить все строки из таблицы2 (вместо тех, что указаны в таблице 1). Вам нужно либо изменить 'EXISTS' для соответствия моей, либо изменить' Exists (SELECT pk FROM table1) 'на' m.pk IN (SELECT pk FROM table1) '. – VeeArr

+0

Его решение с тех пор было правильным, используя второй метод, который я предложил. Теперь он должен работать нормально. – VeeArr