sql >> Databasteknik >  >> RDS >> PostgreSQL

Vägledning om hur du använder WITH-satsen i SQL

Om det kan finnas samtidig skrivåtkomst för inblandade tabeller finns det tävlingsförhållanden i följande frågor. Tänk på:

Ditt exempel kan använd ett CTE (vanligt tabelluttryck), men det ger dig inget som en underfråga inte kunde göra:

WITH x AS (
   SELECT  psp_id
   FROM    global.prospect
   WHERE   status IN ('new', 'reset')
   ORDER   BY request_ts
   LIMIT   1
   )
UPDATE global.prospect psp
SET    status = status || '*'
FROM   x
WHERE  psp.psp_id = x.psp_id
RETURNING psp.*;

Den returnerade raden kommer att vara den uppdaterade version.

Om du vill infoga den returnerade raden i en annan tabell, det är där en WITH klausul blir väsentlig:

WITH x AS (
   SELECT  psp_id
   FROM    global.prospect
   WHERE   status IN ('new', 'reset')
   ORDER   BY request_ts
   LIMIT   1
   )
, y AS (
   UPDATE global.prospect psp
   SET    status = status || '*'
   FROM   x
   WHERE  psp.psp_id = x.psp_id
   RETURNING psp.*
   )
INSERT INTO z
SELECT *
FROM   y;

Datamodifierande frågor med CTE lades till med PostgreSQL 9.1.
The manual om WITH frågor (CTE).



  1. Förvandla en lång tabellkolumn till tabell med flera kolumner

  2. MySQL:använd värde från en annan tabell som kolumnalias?

  3. Mysql-underfrågan gör alltid filsortering

  4. Fel vid infogning av urdu-data i php Mysql