sql >> Database teknologi >  >> RDS >> PostgreSQL

RETURNING forårsager fejl:manglende FROM-klausulindgang for tabellen

Det er rigtigt, som det er blevet bemærket, at RETURNING klausul af en INSERT ser kun den indsatte række. Mere specifikt, citerer manualen her :

Fed min vægt.
Så intet forhindrer dig i at tilføje en korreleret underforespørgsel til RETURNING liste:

indsæt i medarbejdere.password_resets som EP (empl_pwd_reset_uuid, empl_user_pvt_resets som ep (empl_pwd_reset_uuid, empl_user_pvt_resets som ep (empl_pwd_reset_uuid, empl fra 2021-04-18 19:57:47.111365', eu.empl_user_pvt_uuid , '19d65aea-7c4a-41bc-b580-9d047f1503e6'FROM employees.users euWHERE empl_user_pub_uuid ='e2bb39f1f28011eab66c63cb4d9c7a34'RETURNING for_empl_user_pvt_uuid AS empl_user_pvt_uuid -- alias to meet your org. forespørgsel , (VÆLG e-mail FRA ansatte.emails WHERE empl_user_pvt_uuid =ep.empl_user_pvt_uuid BESTIL EFTER t DESC - NULLS SIDSTE? GRÆNSE 1) SOM e-mail, (VÆLG navn_først FRA medarbejdere.profiler HVOR ???empl_ulder_vdPuLOR ??? LIMIT 1 ) AS name_first;

Dette er også meget mere effektivt end den forespørgsel, du havde (eller det, der blev foreslået) af flere årsager.

Plus, muligvis vigtigst, dette er korrekt . Vi bruger data fra rækken, der faktisk er blevet indsat - efter indsætter det. (Se citat øverst!) Efter mulige standardværdier er triggere eller regler blevet anvendt. Vi kan være sikre på, at det, vi ser, er det, der faktisk er i databasen (i øjeblikket).

Du har ingen ORDER BY for profiler.navn_først . Det er ikke rigtigt. Enten er der kun én kvalificerende række, så behøver vi ingen DISTINCT heller ikke LIMIT 1 . Eller der kan være flere, så har vi også brug for en deterministisk ORDER BY for at få et deterministisk resultat.

Og hvis emails.t kan være NULL, skal du tilføje NULLS LAST i ORDER BY klausul. Se:

Indekser

Ideelt set har du disse indekser med flere kolonner (med kolonner i denne rækkefølge):

  • brugere (empl_user_pub_uuid, empl_user_pvt_uuid)
  • e-mails (empl_user_pvt_uuid, e-mail)
  • profiler (empl_user_pvt_uuid, name_first)

Så, hvis bordene er støvsuget nok, får du tre indeksscanninger, og hele operationen er lynhurtig.

Få præ-INSERT værdier?

Hvis du virkelig ønsker det (hvilket jeg ikke tror, ​​du gør), så overvej:



  1. SQLAlchemy JSON som blob/tekst

  2. Beregn procenter fra SUM() i den samme SELECT sql-forespørgsel

  3. JDBC ERROR:08S01 sker nogle gange

  4. Oracle Text fungerer ikke med NVARCHAR2. Hvad ellers kan være utilgængeligt?