"Duplikaty" w zapytaniu (SELECT)

0

Cześć i czołem. Ogólnie jest to pewnie prosty problem, ale jakoś nie potrafię zapytać odpowiednio, bo nie znajduję podpowiedzi na necie.
Powiedzmy że mam taki schemacik bazy:

tab1 (pk: id1, nazwa) <-> tab_mapa (pk: id; fk: tab1_id1, tab2_id2) <-> tab2(pk: id2, nazwa_typu)

Czyli mam mapę, która łączy nazwy z tab1 oraz typy z tab2. Jedna nazwa może mieć wiele typów, więc jakbym napisał tak:

SELECT tab1.nazwa, tab2.nazwa_typu FROM ... 

to dostaję wszystkie nazwy powiązane z typami, jednak niektóre typy są ważniejsze od innych (powiedzmy, że im niższy id tym ważniejszy typ) i chcę wyświetlić tylko ten ważniejszy typ dla danej nazwy, bez tych mniej ważnych.

Da się bez cursorów obejść? Jeśli tak, to nakierujcie proszę :)

0

distinct powinno pomóc (select distinct ...)

0

DISTINCT usuwa z wyników zapytania powtarzające się wiersze, więc nie pomoże ;-)

0

Musisz zrobić coś w stylu:

SELECT tab1.nazwa, min(tab2.id2) FROM tab1 INNER JOIN tab_map ON tab1.id = tab1_id1 INNER JOIN tab2 ON tab2.id = tab2_id2
group by tab1.nazwa

Żeby wyświetlić sobie nazwę + minimalny id typu dla tej nazwy. Żeby teraz wyciągnąć z tego nazwę tego minimalnego typu to musisz to joinować jeszcze raz z tą tabelą z nazwami (tak zeby ID się zgadzały), czyli wyjdzie coś takiego:

SELECT tab1.nazwa, name_resolver.nazwa_typu FROM tab1 INNER JOIN tab_map ON tab1.id = tab1_id1 INNER JOIN tab2 ON tab2.id = tab2_id2 INNER JOIN tab2 as name_resolver ON name_resolver.id2 = min(tab2.id2) 
group by tab1.nazwa, name_resolver.nazwa_typu

Chociaż łatwiej byłoby gdybym miał jak to przetestować ;]

0

Dzięki za odpowiedź.
Niestety nie działa, dostaję error:
An aggregate cannot appear in an ON clause unless it is in a subquery contained in a HAVING clause or select list, and the column being aggregated is an outer reference.

Próbowałem z tym coś pokombinować, ale coś mi się nie udaje.

0
 select tab1.nazwa, tab2.nazwa_typu from tab1 inner join (select tab1_id, min(tab2_id) tab2id from tab_map group by tab1_id) tabm on (tab1.id=tabm.tab1_id) inner join tab2 on (tabm.tab2id=tab2.id)

Pozdrawiam
Paweł Dmitruk

1 użytkowników online, w tym zalogowanych: 0, gości: 1