pomoć za SQL upit

Pozdrav,

Tablica izgleda ovako: objektID | atribut | vrijednost

Jedan objektID može imati više različitih atributa, npr:

4 | 1 | 0548
4 | 2 | 0155
4 | 3 | 1842
7 | 1 | 7454
7 | 6 | 4851
3 | 1 | 7456
3 | 9 | 1254

Sad ono što upit treba napraviti: Pronaći objektID koji ima atribute recimo 1 i 3 (uvijek su zadana samo dva atributa) …i treba očitati za svaki atribut vrijednost iz polja vrijednost.

Radim to ovako:

Takav upit mi je djelomično zadovoljavajuć, ali problem mi je što mi ne vraća vrijednost za polje gdje je atribut=3. Imam osjećaj da je čitanje još tog podatka s ovakvim upitom trivijalna stvar, al da ja jednostavno nisam dovoljno spretan sa slaganjem upita. Help! :slight_smile:

vjerovatno nisam dobro razumio zadatak, ali možda ovako?
SELECT objektID,vrijednost FROM table_name WHERE atribut in (1,3) AND objektID IN
(SELECT objektID FROM table_name WHERE atribut=3)

Pretpostavljam da je ovo ono što tražiš. Uoči da je predispozicija da je uređeni par ( objektID, atribut ) kandidat za primarni ključ (dakle, da isti objektID neće imati više vrijednosti istog atributa).

SELECT
    table_name.objektID
  , table_name.atribut
  , table_name.vrijednost
FROM
    (
        SELECT
            objektID
        FROM
            table_name
        WHERE
            atribut IN ( 1, 3 )
        GROUP BY
            objektID
        HAVING
            2 = COUNT(*)
    ) T
    INNER JOIN
    table_name
    ON
        T.objektID = table_name.objektID
ORDER BY
    table_name.objektID
  , table_name.atribut
  ;

Uoči da više od jednog objekta može imati tražene atribute. U primjeru koji si dao, objekt 4 bi bio jedini koji bi zadovljavao i upit bi vratio dva zapisa.

Uočit ćeš da je stvar lako proširiti za više atributa od 2, a ako broj atributa nije fiksiran, trebalo bi dodati tablicu (npr. u privremenom prostoru) kroz koju bi se zadao skup atributa, ili dinamički generirati tekst upita.

Hvala vam!

Možda da te ne zbuni različitost mog upita u odnosu na prethodni i ono što si ti pokušavao, ovdje je ista stvar, samo bez INNER JOINA, i s korištenjem IN klauzule. Kada bi prikazao plan izvođenja obadva upita, dobio bi identičan plan - optimalizator bi izveo upit na prvi način u obadva slučaja:

SELECT
    table_name.objektID
  , table_name.atribut
  , table_name.vrijednost
FROM
    table_name
WHERE
    objectID in (
        SELECT
            objektID
        FROM
            table_name
        WHERE
            atribut IN ( 1, 3 )
        GROUP BY
            objektID
        HAVING
            2 = COUNT(*)
    )
ORDER BY
    table_name.objektID
  , table_name.atribut
  ;

Evo tek se sad uspio vratiti za komp…ovo ću definitivno bolje proučiti! …hvala još jednom!


Copyright © 2022 WM Forum - AboutContact