Temat: To miało być proste zapytanie....

Witam,

Chciałem [Oracle] połączyć left joinem 3 tabele do jednej nadrzednej, wszytko łączy się po id_platności

Tabele są zbiorami płatności,

proby > merytoryczne > deklaracje

100% rekordów tabeli dekalracje jest w tabeli merytoryczne
100% rekordów tabeli merytoryczne jest w tabeli proby

chciałem połączyć 3 powyższe tabele z tabelą płatności w ten sposób

by z "najcenniejszych" deklaracji były wszytki połączone wiersze,
z tabeli merytoryczne połączyłby się tylko te które nie wystąpiły w połączeniu z deklaracje,
natomiast z tabeli próby tylko te które nie wystąpiły z połączenia z tabelami merytoryczne i deklaracje.

Wydawało mi się, że poniższy select załatwi sprawę, a okazało się że nie mam nic z tabeli merytoryczne i próby

SELECT *
FROM platnosci
left JOIN
deklaracje ON deklaracje.id=platnosci.id
left JOIN
merytoryczne ON meryt.id=platnosci.id AND merytoryczne.id!=deklaracje.id
left JOIN
proby ON proby.id=platnosci.id AND proby.id!=merytoryczne.id AND proby.id!=deklaracje.id


Outer joiny też nie pomogłyTen post został edytowany przez Autora dnia 22.10.14 o godzinie 12:10
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: To miało być proste zapytanie....

ON deklaracje.id=platnosci.id
ON meryt.id=platnosci.id AND merytoryczne.id!=deklaracje.id

Te warunki złączeń są w sprzeczności ze sobą.

Przykład:
platnosci.id = 1
merytoryczne.id = 1
deklaracje.id = 1

Pierwszy join zadziała. Drugi już nie bo:
1=1 (prawda) AND 1!=1 (fałsz) daje zawsze fałsz

Sugeruję skorzystać z not exists. Na przykład:
ON meryt.id=platnosci.id AND not exists (select 1 from deklaracje where merytoryczne.id=deklaracje.id)

Indeks na id zakładam, że jest, bo inaczej będzie wolno działać.

Poprawka:
metoda dobra, ale diagnoza nie do końca trafiona:

Przykład kiedy złączenie z merytoryczne ma zadziałać:
platnosci.id = 1
deklaracje.id = null
merytoryczne.id = 1

Pierwszy join zadziała. Drugi już nie bo:
1=1 (prawda) AND 1!=null (fałsz) daje zawsze fałsz

Złączenie można zrobić łatwiej, bez podzapytania, a zatem i szybciej
ON meryt.id=platnosci.id AND merytoryczne.id!=coalesce(deklaracje.id, merytoryczne.id + 1)Ten post został edytowany przez Autora dnia 22.10.14 o godzinie 16:11
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: To miało być proste zapytanie....

Wydaje mi się, że prosto to ma byc tak:
http://sqlfiddle.com/#!15/61741/1

pozdrawiaMM
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: To miało być proste zapytanie....

Wydaje mi się, że sęk w tym, aby kolumny miały wartości lub nie w zależności od tego czy złączenie z tabelą o "wyższym priorytecie" zaistniało.
Coś takiego
1 | wartość | null | null
2 | null | wartość | null
3 | null | null | wartość

Można to zrobić drzewkiem if else na poziomie select, albo załatwić to sprytnym joinem.

Następna dyskusja:

zapytanie w PostgreSQL




Wyślij zaproszenie do