Вопрос про update

Nikolay Gerasimov
Дата: 12.09.2006 09:29:12
Прошу объяснить в чем проблема. Привожу пример:
CREATE TABLE #PASS (FIO varchar(20), REYS varchar(8), DATV datetime, PSP varchar(20), GOR1 varchar(3), GOR2 varchar(3))

INSERT #PASS VALUES ('ИВАНОВ ААА','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS VALUES ('ИВАНОВ БББ','SU-117','20050802','8797123456','СЫВ','ВКТ' )
INSERT #PASS VALUES ('ИВАНОВ ВВВ','SU-116','20050804','8797123456','ВКТ','СЫВ' )
INSERT #PASS VALUES ('ИВАНОВ ГГГ','SU-394','20050805','8797123456','СЫВ','МОВ' )
INSERT #PASS VALUES ('ИВАНОВ ДДД','SU-393','20050806','8797123456','МОВ','СЫВ' )
INSERT #PASS VALUES ('ИВАНОВ ЕЕЕ','SU-380','20050807','8797123456','СЫВ','МОВ' )

CREATE TABLE #PASS1 (FIO varchar(20), REYS varchar(8), DATV datetime, PSP varchar(20), GOR1 varchar(3), GOR2 varchar(3))

INSERT #PASS VALUES ('ИВАНОВ ААА','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS VALUES ('ИВАНОВ ЗЗЗ','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS VALUES ('ИВАНОВ ИИИ','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS VALUES ('ИВАНОВ ККК','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS VALUES ('ИВАНОВ ЛЛЛ','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS VALUES ('ИВАНОВ МММ','SU-118','20050801','8797123456','ВКТ','СЫВ' )

update #PASS set #PASS.FIO = #PASS1.FIO, #PASS.REYS = #PASS1.REYS, #PASS.DATV = #PASS1.DATV, #PASS.PSP = #PASS1.PSP, #PASS.GOR1 = #PASS1.GOR1, #PASS.GOR2 = #PASS1.GOR2 from #PASS1
where #PASS.REYS = #PASS1.REYS AND #PASS.DATV = #PASS1.DATV

select  * from #PASS

drop table #pass
drop table #pass1
Почему update работает как insert? Я так понимаю, результатом должно стать 11 записей, а у меня практически выходит 12. 'ИВАНОВ ААА' выходит дважды. Почему?
MSSQLUral
Дата: 12.09.2006 09:31:54
Вы в таблицу #PASS1 ничё не вставляли!
MSSQLUral
Дата: 12.09.2006 09:33:33
CREATE TABLE #PASS (FIO varchar(20), REYS varchar(8), DATV datetime, PSP varchar(20), GOR1 varchar(3), GOR2 varchar(3))

INSERT #PASS VALUES ('ИВАНОВ ААА','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS VALUES ('ИВАНОВ БББ','SU-117','20050802','8797123456','СЫВ','ВКТ' )
INSERT #PASS VALUES ('ИВАНОВ ВВВ','SU-116','20050804','8797123456','ВКТ','СЫВ' )
INSERT #PASS VALUES ('ИВАНОВ ГГГ','SU-394','20050805','8797123456','СЫВ','МОВ' )
INSERT #PASS VALUES ('ИВАНОВ ДДД','SU-393','20050806','8797123456','МОВ','СЫВ' )
INSERT #PASS VALUES ('ИВАНОВ ЕЕЕ','SU-380','20050807','8797123456','СЫВ','МОВ' )

CREATE TABLE #PASS1 (FIO varchar(20), REYS varchar(8), DATV datetime, PSP varchar(20), GOR1 varchar(3), GOR2 varchar(3))

INSERT #PASS1 VALUES ('ИВАНОВ ААА','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS1 VALUES ('ИВАНОВ ЗЗЗ','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS1 VALUES ('ИВАНОВ ИИИ','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS1 VALUES ('ИВАНОВ ККК','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS1 VALUES ('ИВАНОВ ЛЛЛ','SU-118','20050801','8797123456','ВКТ','СЫВ' )
INSERT #PASS1 VALUES ('ИВАНОВ МММ','SU-118','20050801','8797123456','ВКТ','СЫВ' )

update #PASS set #PASS.FIO = #PASS1.FIO, #PASS.REYS = #PASS1.REYS, #PASS.DATV = #PASS1.DATV, #PASS.PSP = #PASS1.PSP, #PASS.GOR1 = #PASS1.GOR1, #PASS.GOR2 = #PASS1.GOR2 from #PASS1
where #PASS.REYS = #PASS1.REYS AND #PASS.DATV = #PASS1.DATV

select  * from #PASS

drop table #pass
drop table #pass1
Nikolay Gerasimov
Дата: 12.09.2006 10:12:38
Да уж, что-то я невнимательно отнесся, но полученный результат неустраивает меня, поэтому у меня возник вопрос:
в первой таблице имеется 1 запись удовлетворяющая условиям update. Мне необходимо ее перезаписать и добавить новые 5 которые также удовлетворяют условиям update (т.е. вместо 1 изначальной записи должно стать 6).
Как вариант я понимаю что можно сначала убить 1 запись, затем добавить 6. Я хотел бы узнать другие варианты.
На самом деле по такому принципу у меня обрабатываются в день до 10 тыс записей и понесколько раз. Я понимаю что это не правильно с точки зрения дальнейшей обработки данных т.к. таблица содержит почти 1 млн. записей. Поэтому приходится часто делать reindex и shrinkdatabase
-=DiM@n=-
Дата: 12.09.2006 10:27:38
Может я чего-то не понял, но, видимо, автор хочет что-то такого плана:
UPDATE p 
SET p.FIO = p1.FIO, p.PSP = p1.PSP, p.GOR1 = p1.GOR1, p.GOR2 = p1.GOR2 
FROM #PASS1 p1
		INNER JOIN #PASS p
			ON p.REYS = p1.REYS 
			   AND p.DATV = p1.DATV

INSERT INTO #PASS
SELECT p1.*
FROM #PASS1 p1
		INNER JOIN #PASS p
			ON p.REYS = p1.REYS 
			   AND p.DATV = p1.DATV
WHERE NOT EXISTS (SELECT 1 FROM #PASS WHERE FIO = p1.FIO AND PSP = p1.PSP AND GOR1 = p1.GOR1 AND GOR2 = p1.GOR2)
Nikolay Gerasimov
Дата: 12.09.2006 12:51:53
Данное предложение работает лишь если количество обновляемых записей будет не меньше уже имеющихся, а если к примеру в первой таблице было уже к примеру 5 записей, а их необходимо заменить одной из второй таблицы?
Результат - 5 одинаковых записей в первой таблице.
Glory
Дата: 12.09.2006 12:58:44
Nikolay Gerasimov
Результат - 5 одинаковых записей в первой таблице.

А какой должен быть ?
Nikolay Gerasimov
Дата: 12.09.2006 13:20:38
Результат должен быть - 1 запись.
Смысл следующий набор группы старых записей необходимо заменить новыми и повозможности максимально уйти от delete (т.е. использовать его в случае уменьшения количества записей в группе)
Glory
Дата: 12.09.2006 13:29:29
Nikolay Gerasimov
Результат должен быть - 1 запись.
Смысл следующий набор группы старых записей необходимо заменить новыми и повозможности максимально уйти от delete (т.е. использовать его в случае уменьшения количества записей в группе)

И как же можно удалить из таблицы данные, не используя команду delete ?
Dirty
Дата: 12.09.2006 13:32:35
удаляешь из второй все что есть в первой
копируешь все что есть в первой во вторую