Η επιχειρηματική λογική που κάθε οργανισμός έχει οδηγεί πολλές φορές σε ανάγκες που δεν έχουμε σκεφτεί. Όταν συμβαίνει κάτι τέτοιο στην προσπάθεια να καλύψουμε την ανάγκη καταφεύγουμε σε διάφορες λύσεις χωρίς όμως αυτό πάντα να είναι το ιδανικό.
Μια τέτοια περίπτωση είναι να χρειάζεται να γίνει update σε ένα table αλλά για Ν rows.
Σε SQL Server και Azure SQL Database υπάρχει αυτή η δυνατότητα στην σύνταξη της εντολής. Μάλιστα μπορούμε να επιλέξουμε αν θα είναι απόλυτο νούμερο ή ποσοστό.
Simple case
Κάτι τέτοιο για να γίνει είναι αρκετά απλό, όπως φαίνεται και στο παράδειγμα παρακάτω.
T-SQL Sample
-- with number
update top(2) Production.Products
set unitprice *= 1.1;
-- with percent
update top(2) percent Production.Products
set unitprice *= 1.1;
ATTENTION
Οι παρενθέσεις είναι υποχρεωτικές στο TOP(N) όταν αυτό χρησιμοποιείται σε INSERT, UPDATE, DELETE statements.
ATTENTION
Όταν χρησιμοποιούμε PERSENT, όπως και στο SELECT επιλέγονται τυχαία οι γραμμές που θα ενημερωθούν
Ordering case
Αν θέλουμε αυτά που θα ενημερωθούν με το TOP(N) να είναι ταξινομημένα εύκολα θα υποθέσει κάποιος ότι με ένα ORDER BY λύνεται αυτό. Όμως αυτό δεν μπορεί να γίνει καθώς δεν υποστηρίζεται το ORDER BY στο UPDATE.
T-SQL Sample
update top(2) Production.Products
set unitprice *= 1.1
order by unitprice;
Error Message
Msg 156, Level 15, State 1, Line 14
Incorrect syntax near the keyword 'order'.
Σε αυτή την περίπτωση θα πρέπει να ακολουθήσουμε κάποιο από τους παρακάτω τρόπους:
T-SQL Sample - 1st method
with U as
(
select top(2) *
from Production.Products
order by unitprice
)
update U
set unitprice *=1.1;
T-SQL Sample - 2nd method
update Production.Products
set unitprice *=1.1
from Production.Products as p
inner join
(
select top(2) *
from Production.Products
order by unitprice
) as o on o.productid = p.productid
//Antonios Chatzipavlis