Dec 9

Pentru utilizatorii de mySQL e greu cand se vad pe o lpatforma MSSQL. Iata 2 chestii folositoare, care ne enerveaza la MSSQL (si nu numai), pentru ca in alte motoare de baze de date nu le avem :

In MSSQL nu avem LIMIT, nu avem LIMIT, cum procedam ? Iata o sugestie :

select * from (
   select top 10 user_id,user_name from (
  select top 30 user_id,user_name from employee order by user_name asc
  ) as table1 order by user_name desc
) as table2 order by user_name asc

O alta chestie care se comporta diferit este clauza GROUP BY.

In mySQL putem face chestii de genul (nu foarte intelepte, dar totusi utile uneori, si vazute destul de des in aplicatii) :

Select * FROM products
INNER JOIN properties on properties.product_id = products.product_id
WHERE status_id = 1
GROUP BY product_id

In MSSQL soate campurile din select trebuie sa fie agregate sau in clauza pentru a putea face un group by (suna ca dracu in romana).

asa ca query-ul se sparge in 2 si vom folosi operatorul IN (query) :

SELECT * FROM products
INNER JOIN properties on properties.product_id = products.product_id
where status_id IN (
 SELECT product_id FROM products
 WHERE status_id = 1
 GROUP BY product_id
)
Dec 9

Ok, presupunem o tabela cu urmatoarele campuri : id, event_date, user_id, client_id , tip, observatii. Acesta tabela este folosita si de un webservice. Care din cand in cand o ia razna (pe legaturi proste) si baga in ea duplicate. Presupunem ca tabela se numeste events. Hai sa vedem cum scapam de duplicate. E clar ca id-ul nu poate fi folosit (e unic, e cheie primara, are autoincrement, deci select distinct * from events nu ne va ajuta deloc). Pai si ce facem, vom zice ?

Pai creem o tabela temporara cu inregistrarile duplicate (fara a lua in considerare ID-ul) . Stergem tabela initiala si apoi recopiem din tabela temporara in tabela initiala:

CREATE TEMPORARY TABLE temp AS SELECT DISTINCT event_date, user_id, client_id , tip, observatii FROM events;
DELETE FROM events;
INSERT INTO events (event_date, user_id, client_id , tip, observatii) SELECT * from temp;

Nu e chiar asa de greu, nu-i asa ?

CREATE TABLE events_copy
SELECT * FROM events;

Si faceti un backup inainte de operatie. Aveti oricum un backup de acum 1 ora, nu-i asa ? NU ? Rau faceti.