[PL/SQL] Jak poprawnie wykonać left outer join


(Czajo) #1

Witam. Mam taki problem, że w zapytaniu mam połączone kilka tabel przez warunki w WHERE (nazwijmy to zapytaniem A). Potrzebuję dodać do tego tabelę, gdzie są zapisywane zmiany statusu. Próbowałem zrobić to zarówno przez WHERE jak i przepisać zapytanie na JOIN’y i zawsze wynik jest taki sam. Dostaję część wspólną złączonych tabel, nawet przy wykonaniu LEFT OUTER JOIN, który w myśl schematu poniżej powinien dać dobry wynik.
obraz

Jak mógłbym osiągnąć to co na obrazku wyżej, zakładając, że lewa strona to zapytanie A, a prawa to tabela, którą chcę dołączyć?


(hindus) #2

Pokaż kod SQL który nie działa :slight_smile:


(Czajo) #3

Przepisałem zapytanie na nowo pozbywając się zbędnych tabel i złączeń i jest o wiele lepiej - przynajmniej zaczęło działać. Teraz mam trochę inne pytanie. Co trzeba by było zrobić, by pokazywało mi tylko rekordy z najnowszą datą (qs.date_performed)?

SELECT w.wh_nr       "magazyn",
   lu.loadunit_nr    "nr nośnika",
   p.PRODUCT_NR      "nr artykułu",
   sn.serial_nr      "partia",
   p.name            "nazwa",
   lu.status_quality "status jakości",
   qs.reason         "powód",
   qs.info           "opis",
   qs.date_performed "data"
  FROM load_units_fast  lu,
   hist_qs_change   qs,
   qcm_products     p,
   lu_contents_fast luc,
   warehouses       w,
   storageareas     sa,
   storageplaces    sp,
   qcm_prod_serials sn
  WHERE lu.loadunit_id = qs.object_id(+)
 AND luc.loadunit_id = lu.loadunit_id
AND luc.product_id = p.PRODUCT_ID
AND lu.sp_id = sp.sp_id
AND sp.sa_id = sa.sa_id
AND sa.wh_id = w.WH_ID
AND luc.prod_serial_id = sn.prod_serial_id
AND p.PRODUCT_ID = sn.product_id
AND lu.status_quality = '19'
AND (qs.status_after <> '0' AND qs.status_after <> '1' OR
    qs.status_after IS NULL)
 AND (lu.status_quality <> '0' AND lu.status_quality <> '1' OR
   lu.status_quality IS NULL)
GROUP BY w.wh_nr,
      lu.loadunit_nr,
      p.PRODUCT_NR,
      p.name,
      qs.reason,
      qs.info,
      sn.serial_nr,
      qs.status_after,
      lu.status_quality,
      qs.date_performed
 ORDER BY 2, 9

(hindus) #4

Pobierz maksymalną datę w osobnym podzapytaniu i wykorzystaj wynik jako argument do WHERE.