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!
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.
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
;