[SQL] Złożone połączenie

0

Witam, mam następujący problem.
Mamy 3 tabele

tabela1, tabela2,tabela3.

tabela2 zawiera połączenia pomiędzy rekordami z tabela1 i z tabela3. Potrzebuję stworzyć widok, który na podstawie id z tabela1 w przypadku gdy występuje połączenie w tabela2 (pomiędzy rekordami z tabela1 od tym id i tabela3) wyświetla rekordy z tabela3 odpowiadające temu połączeniu, w przeciwnym wypadku wyświetla całą tabela3. Prosiłbym o rade bo już wyczerpują mi się pomysły. Bez problemu potrafię wylistować te rekordy, które są połączone przez tabela2, ale nie potrafię jednocześnie obsłużyć tego drugiego przypadku.

0
  1. definicja tabel
  2. przykłądowe dane wej i wyj
  3. i CZYTELNY opis tego co chcesz zrobić
0

Przepraszam, wiem że to skomplikowanie brzmi.
A więc tak mam tab1:

id | nr

1 | 1
2 | 2

tab3:


id | nr

1 | 1
2 | 2

tab2:


tab1_id | tab2_id | priorytet

 1          |      2     |       1

tab2, to jest tabela przypisań elementów z tab1 do tab3.
Chodzi o to żeby widok dla podanego id z tab1 wyświetlił
tylko te rekordy z tab3 posortowane względem piorytetu z tab2 z którymi dany rekord z tab1 jest powiązany. Natomiast gdy powiązań nie ma, aby wyświetlił wszystkie rekordy z tab2 (kolumna priorytet jako NULL wtedy).
Czyli dla tego przykładu, który podałem dla podanego tab1.id = 1 zostanie wylistowany rekord z tabeli tab3 o id=2 (bo takie jest powiązanie w tab2), natomiast dla podanego tab1.id = 2 zostaną wylistowane wszystkie (w tym przypadku) dwa rekordy z tab3. (Ponieważ tab1.id = 2 nie ma w tabeli powiązań)

0

nie da się tak zrobić zapytaniem bo zapytanie nie ma możliwości wyśeietlić co innego jak nie ma wyników a co innego jak są

tu masz pierwszą część

SELECT 
  t3.*
FROM
  tab2 t2,
  tab3 t3
WHERE
  t2.tab1_id = :id
  AND t2.tab3_id = t3.id
ORDER BY
  t2.priorytet

możesz to zrobić jedynie jako widok ale z procedury

0

No tą pierwszą część oczywiście mam zrobioną. Tak myślałem, że zwykłym widokiem sie tego nie da zrobić, ale wolałem się jeszcze dopytać. Dzięki wielkie :)

0

Można to zrobić jednym zapytaniem:

(SELECT
  t3.*
FROM
  tab2 t2 JOIN tab3 t3 ON t2.tab3_id = t3.id
WHERE
  t2.tab1_id = :id
ORDER BY
  t2.priorytet)

UNION ALL

(SELECT t3.* FROM
  tab3 t3,
  (SELECT COUNT(*) cnt FROM tab2 WHERE tab1_id = :id) t2
WHERE t2.cnt=0)
0

Wygląda na to, że wszystko działa, kompletnie o takim rozwiązanie nie pomyślałem nawet. Dziękuje serdecznie.

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