Welcome to Sign in | Help

Re: Script de SELECT ?

  •  02-14-2007, 11:34 AM

    Re: Script de SELECT ?

    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 

View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems