Jakub G.

Jakub G. Specjalista ds.
wdrożeń
oprogramowania,
integracji sieci ...

Temat: Przerobienie view na delete query

Witam,

Stworzylem widok VIEW w MS SQL Management Studio 2005 i chciałbym usunąć rekordy, które po wykonaniu pokazuje :

SELECT dbo.ServiceUsage_T.ID, dbo.BudgetTransactions_T.ServiceUsage
FROM dbo.ServiceUsage_T INNER JOIN
dbo.BudgetTransactions_T ON dbo.ServiceUsage_T.ID = dbo.BudgetTransactions_T.ServiceUsage
WHERE (dbo.ServiceUsage_T.UsageEnd > '2012-11-15') AND (dbo.ServiceUsage_T.StreamVersion <> 'NULL') AND (dbo.ServiceUsage_T.StreamVersion <> '')

Prosta zmiana SELECT NA DELETE w nowo stworzonym oknie edycji kwerendy skutkuje błędem (chociażby już w pierwszej linii -> kompilerowi nie podoba się ","(przecinek) . To co próbuję zrobić to oczywiście tzw. "multiple-tables rows deleting" .

Czy ktoś mógłby mi wskazać właściwą drogę :) ?

Pozdrawiam,
Krzysztof Fiutek

Krzysztof Fiutek menadżer projektu,
Asseco Bussines
Solutions

Temat: Przerobienie view na delete query

Powiem szczerze że nie słyszałem o czymś takim w SQL (nie wiem co o tym by powiedział Codd :) )
Ja to bym zrobił w ten sposób że robisz delte na jednej tabelce. Dodatkowo tworzysz pomiędzy tabelami FOREIGN KEY z klauzulą ON DELETE i teoretycznie samo powinno się usunąć w drugiej.
Jeśli z jakiś powodów nie może być klucza obcego to napisał bym triggera na on delte.
Maciej T.

Maciej T.
====================
============

Temat: Przerobienie view na delete query

Jakub G.:
(dbo.ServiceUsage_T.StreamVersion <> 'NULL')
a tak na marginesie - bardzo ciekawy kawałek.. :-), czy tu faktycznie chodzi o napis NULL czy o wartość NULL ?

generalnie fajnie byłoby gdybyś wkleił tę prostą zmianę..
rozumiem, że wygląda ona tak:

DELETE
FROM dbo.ServiceUsage_T INNER JOIN
dbo.BudgetTransactions_T ON dbo.ServiceUsage_T.ID = dbo.BudgetTransactions_T.ServiceUsage
WHERE (dbo.ServiceUsage_T.UsageEnd > '2012-11-15') AND (dbo.ServiceUsage_T.StreamVersion <> 'NULL') AND (dbo.ServiceUsage_T.StreamVersion <> '')

bo jeżeli chodzi o wartość NULL to powinno być raczej:

DELETE
FROM dbo.ServiceUsage_T INNER JOIN
dbo.BudgetTransactions_T ON dbo.ServiceUsage_T.ID = dbo.BudgetTransactions_T.ServiceUsage
WHERE (dbo.ServiceUsage_T.UsageEnd > '2012-11-15') AND (ISNULL(dbo.ServiceUsage_T.StreamVersion, '') <> '')

--AND (dbo.ServiceUsage_T.StreamVersion <> '') - to załatwiliśmy ISNULL'emMaciej Tomaszewski edytował(a) ten post dnia 16.11.12 o godzinie 23:48

konto usunięte

Temat: Przerobienie view na delete query

Krzysztof Fiutek:
Powiem szczerze że nie słyszałem o czymś takim w SQL (nie wiem co o tym by powiedział Codd :) )
Ja to bym zrobił w ten sposób że robisz delte na jednej tabelce. Dodatkowo tworzysz pomiędzy tabelami FOREIGN KEY z klauzulą ON DELETE i teoretycznie samo powinno się usunąć w drugiej.
Jeśli z jakiś powodów nie może być klucza obcego to napisał bym triggera na on delte.

a jak wygląda wydajność tego co proponujesz w dużych zbiorach danych?
Maciej T.

Maciej T.
====================
============

Temat: Przerobienie view na delete query

wersja z triggerem na dużych zbiorach to tylko na komputery klasy deepblue.....
jeżeli dane mają się usunąć za jednego ludzkiego życia

a drugą opcję sam opisałeś :)
Przemysław R.:
http://www.wss.pl/forum/watek/usuwanie-danych-z-dwoch-...Maciej Tomaszewski edytował(a) ten post dnia 17.11.12 o godzinie 07:24

konto usunięte

Temat: Przerobienie view na delete query

Maciej Tomaszewski:
wersja z triggerem na dużych zbiorach to tylko na komputery klasy deepblue.....
jeżeli dane mają się usunąć za jednego ludzkiego życia

a drugą opcję sam opisałeś :)

oj tam, oj tam
ja to wiem, chciałem żeby tu kolega się wypowiedział, skoro proponuje
Maciej T.

Maciej T.
====================
============

Temat: Przerobienie view na delete query

skoro proponuje to znaczy, że nie wie :-)
Krzysztof Fiutek

Krzysztof Fiutek menadżer projektu,
Asseco Bussines
Solutions

Temat: Przerobienie view na delete query

Na triggerze nigdy tego nie stosowałem, to tylko czysto teoretyczna propozycja. Zawsze podobny problem rozwiązywałem na kluczu obcym dodając on delete cascade. Co do wydajności tego rozwiązania - nie zauważyłem by trwało to jakoś specjalnie dłużej, aczkolwiek wiadomym jest że takie rozwiązania zanim wdroży się w życie zawsze warto wcześniej przetestować. Moje rozwiązania to tylko propozycja a nie idealna recepta. Rozwiązane problemu zasugerowałem nie wiedząc nic o schemacie bd, powiązaniach między tabelami, obciążeniu, wykorzystaniu tabelek itp.

Wojciech Gardziński

Wypowiedzi autora zostały ukryte. Pokaż autora
Janusz Rafał Szpiglewski

Janusz Rafał Szpiglewski
http://www.youtube.c
om/watch?v=uuTpKX82i
-Q

Temat: Przerobienie view na delete query

po zmianie SELECT na DELETE
Zmień nazwy kolumn na alias tabeli z której usuwasz dane.
Kamil N.

Kamil N. Expert of Microsoft
SQL Server, Business
Intelligence & D...

Temat: Przerobienie view na delete query

Jeśli w prosty sposób chcesz użyć przygotowanego SELECT'a do usunięcia danych to najlepiej w ten sposób:
DELETE FROM .... (tu oczywiście bez JOIN'ów)
lub
DELETE FROM tabela WHERE tabela.ID IN (SELECT ID ......) - w podzapytaniu możesz używać JOINów, ale wynik podzapytania to tylko jedna kolumna.
lub
możesz użyć do usuwania zdefiniowanego VIEW (tak jak można za pomocą VIEW wykonywać UPDATE), ALE jest przynajmniej jeden warunek: VIEW może korzystać tylko z jednej tabeli - w przeciwnym wypadku dostaniesz błąd:
View or function 'ViewName' is not updatable because the modification affects multiple base tables.
Ogólnie więc kasowanie możesz wykonywać tylko na jednej tabeli jednocześnie (chyba że użyjesz reguły na Foreign Key - o czym pisał Krzysztof)
Janusz Rafał Szpiglewski

Janusz Rafał Szpiglewski
http://www.youtube.c
om/watch?v=uuTpKX82i
-Q

Temat: Przerobienie view na delete query

Nie prawda. Możesz z Joinem.
Kamil N.

Kamil N. Expert of Microsoft
SQL Server, Business
Intelligence & D...

Temat: Przerobienie view na delete query

Janusz, z JOINem mógłbyś używając drugiego słowa FROM. W moim przykładzie tego nie było.
Janusz Rafał Szpiglewski

Janusz Rafał Szpiglewski
http://www.youtube.c
om/watch?v=uuTpKX82i
-Q

Temat: Przerobienie view na delete query

W Twoim przypadku było totalne query czyli komplikacja na maxa.
AŁAŁAŁ. żadnego drugiego froma

Korepetycje:

PRZYKŁAD!!!!!! chodz tutaj!!!!!!

DELETE zadnego_k_rwa_drugiego_froma
FROM dbo.TableCzujcieSieUlomni zadnego_k_rwa_drugiego_froma
INNER JOIN dbo.TableAfinLekarstwemNaWsztsko a
ON zadnego_k_rwa_drugiego_froma.IdUlomnego = a.IdUlomnego

CZUWAJ!

Zmiana zapytania z joina na INa nie jest dobrym roziązaniem, niesie za sobą ryzyko, że cos przeoczysz lub źle przeinterpretujesz.
Jakub G.

Jakub G. Specjalista ds.
wdrożeń
oprogramowania,
integracji sieci ...

Temat: Przerobienie view na delete query

Widzę, że rozpocząłem dyskusję na całego :)

Chciałem Wam bardzo podziękować. Bazując na Waszych podpowiedziach(szczególnie Janusza oraz Macieja), rozbiłem operację na dwie części.

Użyłem formy(wraz z aliasami):

Delete Tabela1 from
Tabela1 as b
inner join tabela2 as s on
s.ID=b.Serviceusage
where
(warunki)

Następnie proste
delete from tabela2 where (warunki)

Pozdrawiam,

Następna dyskusja:

Analysis Services - Data So...




Wyślij zaproszenie do