Atunci când ai o întrebare de acest gen, cel mai bine este să postezi de la început "DDL, sample data and expected results", aşa cum e scris în http://www.aspfaq.com/etiquette.asp?id=5006. În acest caz, acestea ar putea fi astfel:
CREATE TABLE HiperPL (
Product varchar(10),
Phase varchar(10)
SerialNumber varchar(10),
ComponentSerialNumber varchar(10)
)
INSERT INTO HiperPL VALUES ('A','x','M04','01212')
INSERT INTO HiperPL VALUES ('A','y','M04','01212')
INSERT INTO HiperPL VALUES ('A','y','M04','00000')
INSERT INTO HiperPL VALUES ('A','W','M04','01212')
INSERT INTO HiperPL VALUES ('CR','x','M04','0719')
INSERT INTO HiperPL VALUES ('CR','z','M04','0719')
INSERT INTO HiperPL VALUES ('CR','y','M04','0777')
INSERT INTO HiperPL VALUES ('CR','W','M04','0719')
INSERT INTO HiperPL VALUES ('TT','x','Z04','00333')
INSERT INTO HiperPL VALUES ('TT','z','Z04','00333')
INSERT INTO HiperPL VALUES ('TT','y','Z04','00111')
INSERT INTO HiperPL VALUES ('TT','W','Z04','00111')
În lipsa unor alte informaţii, DDL-ul (structura tabelelor) de mai sus este incomplet, pentru că nu conţine PRIMARY KEY, nu menţionează dacă coloanele permit NULL-uri, iar tipurile şi dimensiunile coloanelor sunt estimative (iar în general ar trebui precizate şi eventualele FOREIGN KEY-uri, CHECK CONSTRAINT-uri, UNIQUE CONSTRAINT-uri).
Presupun că rezultatele dorite sunt:
Product Phase SerialNumber ComponentSerialNumber
---------- ---------- ------------ ---------------------
A y M04 00000
CR y M04 0777
TT x Z04 00333
TT z Z04 00333
(4 row(s) affected)
În acest caz, poţi să utilizezi şi un cursor, dar nu este recomandabil, deoarece soluţia se poate obţine mult mai uşor printr-un singur SELECT:
SELECT * FROM HiperPL a WHERE ComponentSerialNumber<>(
SELECT DISTINCT ComponentSerialNumber FROM HiperPL b
WHERE b.Product=a.Product AND b.Phase='W'
)
Lipsa unui PRIMARY KEY îşi spune cuvântul în acest query. Ce s-ar întâmpla dacă ar exista două rânduri pentru acelaşi produs, cu phase='W' şi cu ComponentSerialNumber-uri diferite ? Care ar fi cel corect ? Pentru că nu avem o regulă pe baza căreia să îl putem determina pe cel corect, query-ul de mai sus va da o eroare (ceva de genul "Subquery returned more than one value").
Răzvan