Обновление таблицы путем извлечения информации из нескольких таблиц - PullRequest
0 голосов
/ 18 февраля 2009

Я попробовал утверждение как оно ниже, и оно не сработало. Query Analyzer вернул "(0) строк, на которые влияют". Хорошие новости ... это не взорвали ... плохие новости ... Я не знаю, что не так с утверждением.

Я думаю, что использую SQL Server 2000. Я еще не пробовал это утверждение в своей демонстрационной базе данных. Второе утверждение - обновить старый oillab (oillabid = 4) до нового oillab (oillabid = 9). Oillabid сопоставляется с oillabstatusid, которые изменяются в таблице oillabstatus.

Я хочу обновить oildatasetstatusid в таблице oildatasetstatus с помощью customerid. Для того, чтобы получить customerid, мне нужно получить oildatasetid (сопоставленный с таблицей oildatasetstatus) и samplepointid из таблицы oildataset. Samplepointid отображается в таблицу точек выборки, которая также содержит customeriteid. Идентификатор customeriteid сопоставляется с таблицей customerite, которая содержит параметр customerid. После завершения этого обновления мне нужно обновить oillabid в таблице oildataset. Я предполагаю, что это должно быть сделано с помощью двух утверждений (показано ниже). Эти заявления выглядят правильными или есть какие-то явные ошибки? Есть ли возможность сделать оба эти обновления в одном утверждении? Спасибо.

update  oildatasetstatus set oildatasetstatusid = 
case 
       WHEN oildatasetstatusid = 5 THEN 16
            WHEN oildatasetstatusid = 6 THEN 17
            WHEN oildatasetstatusid = 7 THEN 18
            WHEN oildatasetstatusid = 8 THEN 18
            WHEN oildatasetstatusid = 9 THEN 18
            WHEN oildatasetstatusid = 10 THEN 19
               WHEN oildatasetstatusid = 11 THEN 20
End    
where oildatasetid in
(
select oildatasetstatusid from oildatasetstatus 
 inner join oildataset on oildataset.oildatasetid=oildatasetstatus.oildatasetid
where samplepoinid in
    (
    select samplepointid from samplepoint where customersiteid in
        (
        select customersiteid from customersite where customerid=2
        )
    )
)

update oildataset set oillabid=9 where oildatasetstatusid between 16 and 20

1 Ответ

0 голосов
/ 18 февраля 2009

Как насчет разбить его и проверить, получаете ли вы правильные результаты и постепенно их объединяете?

Условие WHERE для начального ОБНОВЛЕНИЯ (отредактировано, чтобы ВНУТРЕННИЕ СОЕДИНЕНИЯ вместо ВЫБРАТЬ IN) и также выбрано oildatasetid not oildatasetstatusid :

SELECT oildatasetid FROM oildatasetstatus
INNER JOIN oildataset
    ON oildataset.oildatasetid = oildatasetstatus.oildatasetid
INNER JOIN samplepoint
    ON oildatasetstatus.samplepoinid = samplepoint.samplepointid
INNER JOIN customersite
    ON samplepoint.customersiteid = customersite.customersiteid
WHERE customerid = 2;

Это должно вернуть тот же список oildatasetid, что и ваш запрос, но работать быстрее.

Теперь оператор UPDATE:

UPDATE oildatasetstatus SET oildatasetstatusid = 
    CASE
        WHEN oildatasetstatusid = 5 THEN 16
        WHEN oildatasetstatusid = 6 THEN 17
        WHEN oildatasetstatusid = 7 THEN 18
        WHEN oildatasetstatusid = 8 THEN 18
        WHEN oildatasetstatusid = 9 THEN 18
        WHEN oildatasetstatusid = 10 THEN 19
        WHEN oildatasetstatusid = 11 THEN 20
    END
WHERE oildatasetid IN (
    SELECT oildatasetid FROM oildatasetstatus
    INNER JOIN oildataset
        ON oildataset.oildatasetid = oildatasetstatus.oildatasetid
    INNER JOIN samplepoint
        ON oildatasetstatus.samplepoinid = samplepoint.samplepointid
    INNER JOIN customersite
        ON samplepoint.customersiteid = customersite.customersiteid
    WHERE customerid = 2
);

Я избегаю МЕЖДУ, за исключением случаев, когда это абсолютно необходимо:

UPDATE oildataset SET oillabid = 9 WHERE oildatasetstatusid >= 16 AND oildatasetstatusid <= 20;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...