PostgreSQL - มีข้อ
ใน PostgreSQL คิวรี WITH มีวิธีการเขียนคำสั่งเสริมเพื่อใช้ในแบบสอบถามขนาดใหญ่ ช่วยในการแบ่งแบบสอบถามที่ซับซ้อนและมีขนาดใหญ่ออกเป็นรูปแบบที่ง่ายขึ้นซึ่งสามารถอ่านได้ง่าย คำสั่งเหล่านี้มักเรียกว่า Common Table Expressions หรือ CTEs สามารถคิดได้ว่าเป็นการกำหนดตารางชั่วคราวที่มีอยู่สำหรับแบบสอบถามเดียว
แบบสอบถาม WITH เป็นแบบสอบถาม CTE มีประโยชน์อย่างยิ่งเมื่อมีการเรียกใช้แบบสอบถามย่อยหลายครั้ง เป็นประโยชน์อย่างเท่าเทียมกันในการแทนที่ตารางชั่วคราว จะคำนวณการรวมครั้งเดียวและช่วยให้เราอ้างอิงตามชื่อ (อาจมีหลายครั้ง) ในการสืบค้น
ต้องกำหนดส่วนคำสั่ง WITH ก่อนที่จะใช้ในแบบสอบถาม
ไวยากรณ์
ไวยากรณ์พื้นฐานของคิวรี C มีดังนี้ -
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]
โดยที่name_for_summary_dataคือชื่อที่กำหนดให้กับอนุประโยคC name_for_summary_data อาจเหมือนกับชื่อตารางที่มีอยู่และจะมีความสำคัญ
คุณสามารถใช้คำสั่งปรับเปลี่ยนข้อมูล (INSERT, UPDATE หรือ DELETE) ใน C สิ่งนี้ช่วยให้คุณสามารถดำเนินการต่างๆในแบบสอบถามเดียวกันได้
เรียกซ้ำด้วย
แบบสอบถามแบบเรียกซ้ำ C หรือตามลำดับชั้นเป็นรูปแบบของ CTE ที่ CTE สามารถอ้างอิงถึงตัวเองกล่าวคือคิวรี WITH สามารถอ้างถึงผลลัพธ์ของตัวเองได้ดังนั้นชื่อเรียกซ้ำตัวอย่าง
พิจารณาตารางCOMPANY ที่มีบันทึกดังนี้ -
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)
ตอนนี้ให้เราเขียนแบบสอบถามโดยใช้ส่วนคำสั่ง WITH เพื่อเลือกบันทึกจากตารางด้านบนดังนี้ -
With CTE AS
(Select
ID
, NAME
, AGE
, ADDRESS
, SALARY
FROM COMPANY )
Select * From CTE;
คำสั่ง PostgreSQL ข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -
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)
ตอนนี้ให้เราเขียนคำค้นหาโดยใช้คำหลัก RECURSIVE พร้อมกับประโยค C เพื่อหาผลรวมของเงินเดือนที่น้อยกว่า 20,000 ดังต่อไปนี้ -
WITH RECURSIVE t(n) AS (
VALUES (0)
UNION ALL
SELECT SALARY FROM COMPANY WHERE SALARY < 20000
)
SELECT sum(n) FROM t;
คำสั่ง PostgreSQL ข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -
sum
-------
25000
(1 row)
ให้เราเขียนข้อความค้นหาโดยใช้คำสั่งปรับเปลี่ยนข้อมูลพร้อมกับอนุประโยคดังที่แสดงด้านล่าง
ขั้นแรกสร้างตาราง COMPANY1 คล้ายกับตาราง COMPANY แบบสอบถามในตัวอย่างย้ายแถวจาก COMPANY ไป COMPANY1 ได้อย่างมีประสิทธิภาพ DELETE in WITH จะลบแถวที่ระบุจาก COMPANY ส่งคืนเนื้อหาโดยใช้ประโยค RETURNING จากนั้นแบบสอบถามหลักอ่านผลลัพธ์นั้นและแทรกลงใน COMPANY1 TABLE -
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);
คำสั่ง PostgreSQL ข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -
INSERT 0 3
ตอนนี้บันทึกในตาราง COMPANY และ COMPANY1 มีดังนี้ -
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)