Cześć. Ostatnio zacząłem trochę bawić się z T-SQL i wymyśliłem sobie taki kazus, który polega na tym, że mam w bazie danych w jednej z tabel zwielokrotnione rekordy, a powinien być tylko jeden wynik z (select z tej tabeli-screen 1 - zaznaczone są wszystkie rekordy zwielokrotnione oraz jeden właściwiy z id produktu 78)
screen 1
I teraz mam tą procedurkę, która w moim zamyśle ma działać w ten sposób:
- Sprawdzam, czy w ogóle w tej tabeli są takie przypadki:
- Jeśli nie, to jest wyświetlony stosowny komunikat.
Te 2 punkty mają być realizowane tą częścią kodu:
if (select COUNT (ProductID) as Ilosc from Products group by ProductName, SupplierID ) = 1
begin
print 'Nie ma ponadwymiarowych rekordów. Wszystko jest w porządku; pracuj dalej:)'
end
- Jeśli tak, to kolejnym zapytaniem pokazuję w komunikacie ile jest ponadwymiarowym (bez tego, który powinien być).
- Następnie w kolejnym zapytaniu tworzę numery ID-ów do usunięcia .
- Tak przygotowaną listę jako podzapytanie przekazuję do delete'a, który ma usunąć te rekordy.
Te 3 punkty mają być realizowane tak:
else
begin
set @IloscPonadwymiarowych = ((select COUNT (ProductID) as Ilosc from Products group by ProductName, SupplierID having count (ProductID) > 1) - 1)
print concat ('Niestety w bazie są ponadwymiarowe rekordy do usunięcia, w liczbie ' ,cast (@IloscPonadwymiarowych as varchar),'.' ,' Teraz je usunę.')
set @IdDoUsunięcia = (select c.idprod from (select ProductID as idprod, A.ProductName, ilosc, minimum as mmm from Products as B join (select ProductName, count (*) as ilosc, min (productID) as minimum from Products group by ProductName) as A on A.ProductName = B.ProductName) as c where c.idprod <> mmm)
delete from Products where ProductID = @IdDoUsunięcia
end
Tak wygląda cała procedura:
use Northwind
go
create or alter procedure UsunPonadwymiaroweRekordy
as begin
declare @IdDoUsunięcia int, @IloscPonadwymiarowych int
if (select COUNT (ProductID) as Ilosc from Products group by ProductName, SupplierID ) = 1
begin
print 'Nie ma ponadwymiarowych rekordów. Wszystko jest w porządku; pracuj dalej:)'
end
else
begin
set @IloscPonadwymiarowych = ((select COUNT (ProductID) as Ilosc from Products group by ProductName, SupplierID having count (ProductID) > 1) - 1)
print concat ('Niestety w bazie są ponadwymiarowe rekordy do usunięcia, w liczbie ' ,cast (@IloscPonadwymiarowych as varchar),'.' ,' Teraz je usunę.')
set @IdDoUsunięcia = (select c.idprod from (select ProductID as idprod, A.ProductName, ilosc, minimum as mmm from Products as B join (select ProductName, count (*) as ilosc, min (productID) as minimum from Products group by ProductName) as A on A.ProductName = B.ProductName) as c where c.idprod <> mmm)
delete from Products where ProductID = @IdDoUsunięcia
end
end
Jak uruchomię create procedure, to procedura dodaje się poprawnie do bazy, ale jak już robię jej wykonanie, to jest błąd:
Po pierwsze nie działa if w pierwszej części kodu, bo i tak zawsze jest pokazany komunikat, że są rekordy do usunięcia, nawet jak nie ma zwielokrotnionych.
Po drugie tworząć listę id-ów do usunięcia serwer wymaga ode mnie wyniku skalarnego, a dostaje wektor. Próbowałem też zrobić wariant ze zmienną tabelaryczną, ale też nie to nie działało.
Mógłby któryś z kolegów-programistów spojrzeć na to łaskawym okiem i się wypowiedzieć, co robię nie tak;)
Z góry dzięki za wszelkie komentarze