zapytanie insert into + select w jednym zapytaniu??

0

Witam. Nie rozumiem do końca takiego zapytania, które najpierw próbuje wstawić od bazy rekord poprzez insert into, a później robi selecta z tych wartości, które ma wstawić do tego inserta.
Właśnie, czy ja to dobrze rozumiem, że to zapytanie najpierw robi selecta, a później z tego selecta robi inserta?? Zapytanie jest dosyć długie ale mi zależy na tym insercie i selecie (jak to brzmi).
Oto zapytanie:

insert into KD_WYDRALARMY (WYAL_OSOBA, WYAL_ETAT, WYAL_REJESTR, WYAL_DATA)
select KD.REKA_NAZWISKO || ' ' || I.NAZWA as KADROWICZ, ET.ETAT_NUMER as NRETATU, 'Badania lekarskie' as AREJESTR,
       RB.RBAD_TERMIN
from KD_REJ_KADRY KD
join PL_REJ_ETATY ET on ET.ETAT_IDKADR = KD.REKA_ID
join PL_PLATNICY PL on PL.SPLA_ID = ET.ETAT_PLATNIK
join KD_KADRY_JEDNOSTKA KJ on KJ.KDJE_IDKADR = KD.REKA_ID
left join KD_REJBADANLEK RB on RB.RBAD_IDETATU = ET.ETAT_ID
left join KD_SLBADLEK SBL on SBL.KOD = RB.RBAD_KOD
left join SYS_IMIONA I on I.IDIMIENIA = KD.REKA_IMIE1
join KD_REJ_KADRY_RODZAJ_PRACOWNIKA RP on RP.ID_KADR = KD.REKA_ID and coalesce(RP.ID_RODZAJ_PRACOWNIKA, 1) = 1
left join PL_TRYBYUMOW TU on TU.STUP_ID = ET.ETAT_RODZUMOWY
where (ET.ETAT_DATAZWOL >= '12.05.2020' or ET.ETAT_DATAZWOL is null) and
      coalesce(KJ.KDJE_ARCH, 'N') = 'N' and
      PL.SPLA_ID_SYS_JEDNOSTKI = 2 and
      KJ.KDJE_IDJEDNOSTKI = 2 and
      ((RB.RBAD_ID is null and
      coalesce(ET.ETAT_UMZLECENIE, 0) = 0 and
      coalesce(TU.STUP_TYP, 0) in (1, 2)) or (RB.RBAD_ID is not null and
      RB.RBAD_ID = (select first 1 RB1.RBAD_ID
                    from KD_REJBADANLEK RB1
                    left join KD_SLBADLEK SBL1 on SBL1.KOD = RB1.RBAD_KOD
                    where RB1.RBAD_IDETATU = RB.RBAD_IDETATU and
                          ((SBL.TYP = 1 and
                          SBL1.TYP in (1, 2, 3)) or RB1.RBAD_KOD = RB.RBAD_KOD)
                    order by RB1.RBAD_TERMIN desc) and
      RTRIM(RB.RBAD_KOD) in (select RTRIM(KOD)
                             from KD_SLBADLEK
                             where STRLEN(RTRIM(NAZWA)) > 0) and
      (RB.RBAD_TERMIN - 14) <= '12.05.2020'))    

A oto wynik tego zapytania. Wstawia 7 rekordów do bazy:

screenshot-20200512163800.png

W wynikach na początku po lewej stronie od kolumny WYAL_ETAT są jeszcze dwie kolumny,. Jedna to jest id_alarmu, a druga dane osobowe pracownika, dlatego nie chciałem tego tu wstawiać. Mam wielką prośbę o wyjaśnienie tego zagadnienia.

1

To zapytanie prawdopodobnie wstawia do bazy dane, które dostaje z selecta. Co to za baza?

2

Twoje zapytanie w pierwszej kolejności wykonuje SELECTa:

select KD.REKA_NAZWISKO || ' ' || I.NAZWA as KADROWICZ, ET.ETAT_NUMER as NRETATU, 'Badania lekarskie' as AREJESTR,
       RB.RBAD_TERMIN
from KD_REJ_KADRY KD
join PL_REJ_ETATY ET on ET.ETAT_IDKADR = KD.REKA_ID
join PL_PLATNICY PL on PL.SPLA_ID = ET.ETAT_PLATNIK
join KD_KADRY_JEDNOSTKA KJ on KJ.KDJE_IDKADR = KD.REKA_ID
left join KD_REJBADANLEK RB on RB.RBAD_IDETATU = ET.ETAT_ID
left join KD_SLBADLEK SBL on SBL.KOD = RB.RBAD_KOD
left join SYS_IMIONA I on I.IDIMIENIA = KD.REKA_IMIE1
join KD_REJ_KADRY_RODZAJ_PRACOWNIKA RP on RP.ID_KADR = KD.REKA_ID and coalesce(RP.ID_RODZAJ_PRACOWNIKA, 1) = 1
left join PL_TRYBYUMOW TU on TU.STUP_ID = ET.ETAT_RODZUMOWY
where (ET.ETAT_DATAZWOL >= '12.05.2020' or ET.ETAT_DATAZWOL is null) and
      coalesce(KJ.KDJE_ARCH, 'N') = 'N' and
      PL.SPLA_ID_SYS_JEDNOSTKI = 2 and
      KJ.KDJE_IDJEDNOSTKI = 2 and
      ((RB.RBAD_ID is null and
      coalesce(ET.ETAT_UMZLECENIE, 0) = 0 and
      coalesce(TU.STUP_TYP, 0) in (1, 2)) or (RB.RBAD_ID is not null and
      RB.RBAD_ID = (select first 1 RB1.RBAD_ID
                    from KD_REJBADANLEK RB1
                    left join KD_SLBADLEK SBL1 on SBL1.KOD = RB1.RBAD_KOD
                    where RB1.RBAD_IDETATU = RB.RBAD_IDETATU and
                          ((SBL.TYP = 1 and
                          SBL1.TYP in (1, 2, 3)) or RB1.RBAD_KOD = RB.RBAD_KOD)
                    order by RB1.RBAD_TERMIN desc) and
      RTRIM(RB.RBAD_KOD) in (select RTRIM(KOD)
                             from KD_SLBADLEK
                             where STRLEN(RTRIM(NAZWA)) > 0) and
      (RB.RBAD_TERMIN - 14) <= '12.05.2020'))

A następnie wartości z tego SELECTa ładuje do tabeli KD_WYDRALARMY.

0
Tomek Pycia napisał(a):

To zapytanie prawdopodobnie wstawia do bazy dane, które dostaje z selecta. Co to za baza?

A sory nie napisałem. To jest Firebird.

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