PostgreSQL - Madde İLE

PostgreSQL'de, WITH sorgusu, daha büyük bir sorguda kullanılmak üzere yardımcı ifadeler yazmanın bir yolunu sağlar. Karmaşık ve büyük sorguları kolayca okunabilen daha basit biçimlere ayırmaya yardımcı olur. Genellikle Ortak Tablo İfadeleri veya CTE'ler olarak adlandırılan bu ifadeler, yalnızca bir sorgu için var olan geçici tabloları tanımlıyor olarak düşünülebilir.

CTE sorgusu olan WITH sorgusu, özellikle alt sorgu birden çok kez yürütüldüğünde kullanışlıdır. Geçici tablolar yerine eşit derecede faydalıdır. Toplamayı bir kez hesaplar ve sorgularda adıyla (birden çok kez olabilir) referans vermemize izin verir.

WITH yan tümcesi, sorguda kullanılmadan önce tanımlanmalıdır.

Sözdizimi

WITH sorgusunun temel sözdizimi aşağıdaki gibidir -

WITH
   name_for_summary_data AS (
      SELECT Statement)
   SELECT columns
   FROM name_for_summary_data
   WHERE conditions <=> (
      SELECT column
      FROM name_for_summary_data)
   [ORDER BY columns]

Burada name_for_summary_data , WITH yan tümcesine verilen addır. Name_for_summary_data, mevcut bir tablo adıyla aynı olabilir ve öncelikli olacaktır.

With'de veri değiştirici ifadeleri (INSERT, UPDATE veya DELETE) kullanabilirsiniz. Bu, aynı sorguda birkaç farklı işlem gerçekleştirmenize olanak tanır.

İLE özyinelemeli

Özyinelemeli WITH veya Hiyerarşik sorgular, bir CTE'nin kendisine başvurabileceği bir CTE biçimidir, yani bir WITH sorgusu kendi çıktısına başvurabilir, dolayısıyla adı özyinelemelidir.

Misal

Aşağıdaki gibi kayıtlara sahip ŞİRKET tablosunu düşünün :

testdb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

Şimdi yukarıdaki tablodan kayıtları seçmek için WITH yan tümcesini kullanarak aşağıdaki gibi bir sorgu yazalım -

With CTE AS
(Select
 ID
, NAME
, AGE
, ADDRESS
, SALARY
FROM COMPANY )
Select * From CTE;

Yukarıda verilen PostgreSQL ifadesi aşağıdaki sonucu verecektir -

id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

Şimdi, 20000'den az maaşların toplamını bulmak için RECURSIVE anahtar sözcüğünü WITH yan tümcesi ile birlikte kullanarak aşağıdaki gibi bir sorgu yazalım -

WITH RECURSIVE t(n) AS (
   VALUES (0)
   UNION ALL
   SELECT SALARY FROM COMPANY WHERE SALARY < 20000
)
SELECT sum(n) FROM t;

Yukarıda verilen PostgreSQL ifadesi aşağıdaki sonucu verecektir -

sum
-------
 25000
(1 row)

Aşağıda gösterildiği gibi, WITH yan tümcesi ile birlikte veri değiştirme ifadelerini kullanarak bir sorgu yazalım.

İlk olarak, COMPANY tablosuna benzer bir COMPANY1 tablosu oluşturun. Örnekteki sorgu, satırları etkili bir şekilde COMPANY'dan COMPANY1'e taşır. İLE içindeki DELETE, belirtilen satırları COMPANY'den siler, RETURNING maddesi aracılığıyla içeriklerini geri döndürür; ve ardından birincil sorgu bu çıktıyı okur ve ŞİRKET1 TABLOSUNA ekler -

CREATE TABLE COMPANY1(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

WITH moved_rows AS (
   DELETE FROM COMPANY
   WHERE
      SALARY >= 30000
   RETURNING *
)
INSERT INTO COMPANY1 (SELECT * FROM moved_rows);

Yukarıda verilen PostgreSQL ifadesi aşağıdaki sonucu verecektir -

INSERT 0 3

Şimdi, COMPANY ve COMPANY1 tablolarındaki kayıtlar aşağıdaki gibidir -

testdb=# SELECT * FROM COMPANY;
 id | name  | age |  address   | salary
----+-------+-----+------------+--------
  1 | Paul  |  32 | California |  20000
  2 | Allen |  25 | Texas      |  15000
  3 | Teddy |  23 | Norway     |  20000
  7 | James |  24 | Houston    |  10000
(4 rows)


testdb=# SELECT * FROM COMPANY1;
 id | name  | age | address | salary
----+-------+-----+-------------+--------
  4 | Mark  |  25 | Rich-Mond   |  65000
  5 | David |  27 | Texas       |  85000
  6 | Kim   |  22 | South-Hall  |  45000
(3 rows)