English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في PostgreSQL، توفر جملة WITH طريقة لكتابة جملة مساعدة يمكن استخدامها في استعلامات أكبر.
تساعد جملة WITH في تقسيم الاستعلامات المعقدة والمتطولة إلى أشكال بسيطة، مما يسهل القراءة. هذه الجمل تُعرف عادةً بـ Common Table Expressions (CTE)، ويمكن أن تكون أيضًا جدولًا مؤقتًا للاستعلام.
تساعد جملة WITH بشكل خاص في تنفيذ العبارات الفرعية عدة مرات، مما يسمح لنا باستخدام اسمها (ربما مرات متعددة) في الاستعلام.
يجب تعريف جملة WITH قبل استخدامها.
القواعد الأساسية للجملة WITH كالتالي:
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 هو اسم جملة WITH،name_for_summary_data يمكن أن يكون الاسم نفسه للجدول الموجود، وله أولوية.
يمكن استخدام جمل INSERT, UPDATE أو DELETE في WITH، مما يسمح لك بإجراء عدة عمليات مختلفة في نفس الاستعلام.
يمكن استخدام بيانات الناتج الخاصة بالـ WITH في جملة WITH.
تعبير الجدول العام (CTE) يمتلك ميزة مهمة وهي القدرة على الاستعانة بنفسه لإنشاء CTE متكرر. CTE المتكرر هو تعبير جدول عام يعيد تنفيذ نفسه مرة أخرى لتحقيق مجموعة بيانات فرعية حتى يتم الحصول على مجموعة بيانات كاملة.
إنشاء جدول COMPANY (تحميل ملف SQL الخاص بـ COMPANY ),محتويات البيانات كالتالي:
w3codeboxdb# 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;
الحصول على النتيجة كالتالي:
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 كتابة استعلام باستخدام الكلمات المفتاحية وWITH للبحث عن: SALARY (الراتب) البيانات التي يقل طولها عن 20000 وتحديد مجموعها:
WITH RECURSIVE t(n) AS ( VALUES (0) UNION ALL SELECT SALARY FROM COMPANY WHERE SALARY < 20000 ) SELECT sum(n) FROM t;
الحصول على النتيجة كالتالي:
sum ------- 25000 (1 row)
سنقوم الآن بإنشاء جدول COMPANY1 مشابه لجدول COMPANY، باستخدام جملة DELETE و子جملة WITH لإزالة بيانات جدول COMPANY: SALARY (الراتب) البيانات التي يبلغ طولها 30000 أو أكثر، ويتم إدراج البيانات المزالة في جدول COMPANY1، لتحقيق نقل بيانات جدول COMPANY إلى جدول COMPANY1:
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);
الحصول على النتيجة كالتالي:
INSERT 0 3
في هذه اللحظة، بيانات جدول CAMPANY و CAMPANY1 كالتالي:
w3codeboxdb=# 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 أسطر) w3codeboxdb=# 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 أسطر)