если существует, вставьте еще обновление - PullRequest
1 голос
/ 03 марта 2012

Я на sql2000 (скоро 2008, да!), Поэтому я пока не могу использовать оператор слияния.

У меня есть вставка, но теперь мне нужно составить оператор обновления.Я хотел бы обернуть это в оператор обновления if else insert.Запрос более длинный и более сложный, но если я смогу получить некоторую помощь по этому основному ниже, я думаю, что смогу получить все целиком.

insert into systemdetail 
    (systemname, projectname, systemtype)
    select  distinct T.systemname, T.projectname, S.model
        from    sysList T, requestSystems S 
        where   T.systemname = S.systemname and 
            S.systemname not in 
            (
            select d.systemname, d.ProjectName from systemdetail d,syslist t2 where t2.systemname = d.SystemName and t2.projectname=d.ProjectName
            )

Записано на английском языке: если имя проекта и имя системы существует втаблица системных деталей, обновите ее.В противном случае вставьте имя проекта и имя системы (и другие поля) в качестве новой записи.

Ниже приведена моя попытка написать if, но я застрял (см. ??? в запросе).

if (exists (select sd.projectname, sd.systemname from systemdetail sd, sysList t where t.projectname = sd.projectname and t.systemname = sd.systemname)
    update systemDetail 
    set projectname = t.projectname, 
    systemname = t.systemname
    where ??? <-- this is where I'm stuck
else
    insert into systemdetail 
    (systemname, projectname, systemtype)
    select  distinct T.systemname, T.projectname, S.model
        from    sysList T, requestSystems S 
        where   T.systemname = S.systemname and 
            S.systemname not in 
            (
            select d.systemname, d.ProjectName from systemdetail d,syslist t2 where t2.systemname = d.SystemName and t2.projectname=d.ProjectName
            )

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Попробуйте следующее:

-- Try update first
UPDATE
    S
SET
    systemtype = X.model
FROM
    systemDetail AS S
JOIN
(
    SELECT DISTINCT
        T.systemname, T.projectname, S.model
    FROM
        sysList T, requestSystems S 
    WHERE
        T.systemname = S.systemname
) AS X
ON
    X.systemname = S.systemname
AND X.projectname = S.projectname

IF @@ROWCOUNT = 0
BEGIN
    insert into systemdetail 
    (systemname, projectname, systemtype)
    select  distinct T.systemname, T.projectname, S.model
        from    sysList T, requestSystems S 
        where   T.systemname = S.systemname and 
            S.systemname not in 
            (
            select d.systemname, d.ProjectName from systemdetail d,syslist t2 where t2.systemname = d.SystemName and t2.projectname=d.ProjectName
            )
END
0 голосов
/ 03 марта 2012

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

...