هل تكرر IN أوEXISTS الصفوف عند تكرار نتائج الاستعلام الداخلي؟

متوسطقراءة دقيقةآخر تحديث 3 أكتوبر 2026

SQL قواعد البيانات

الإجابة

عند استخدام IN أو EXISTS لتصفية صفوف الاستعلام الخارجي، لا تؤدي كثرة المطابقات الداخلية إلى إنشاء نسخ إضافية من الصف الخارجي. كلا الشرطين يقرر قبول الصف أو رفضه. لذلك فإن وجود ثلاثة طلبات للعميل نفسه لا يجعله يظهر ثلاث مرات بسبب هذين الشرطين.

في حالة IN، يكفي أن تساوي القيمة الخارجية إحدى القيم الداخلية. وفي حالة EXISTS المترابط، يكفي وجود صف يحقق شرط الربط. إذا كانت المقارنة نفسها مستخدمة، يمكن للصيغتين اختيار مجموعة العملاء نفسها، مع بقاء اختلافات محتملة في قيمة التعبير المنطقية عندما تدخل NULL في الحساب.

مثال

WITH orders AS (
  SELECT 1 AS customer_id
  UNION ALL SELECT 1
)
SELECT 1 AS customer_id
WHERE 1 IN (SELECT customer_id FROM orders);

هذا لا يعني أن الشرطين يحذفان التكرارات الأصلية من المصدر الخارجي. إذا احتوى ذلك المصدر على صفوف مكررة، فقد تبقى في النتيجة.

باختصار: تكرار المطابقات الداخلية لا يضاعف الصف الخارجي عند التصفية باستخدام IN أو EXISTS.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

ما نتيجة كل من الاستعلامين التاليين؟

CREATE TABLE customers (id INT PRIMARY KEY);
CREATE TABLE orders (id INT PRIMARY KEY, customer_id INT NOT NULL);
INSERT INTO customers (id) VALUES (1), (2);
INSERT INTO orders (id, customer_id) VALUES (10, 1), (11, 1);

SELECT c.id FROM customers AS c
WHERE c.id IN (SELECT o.customer_id FROM orders AS o)
ORDER BY c.id;

SELECT c.id FROM customers AS c
WHERE EXISTS (
  SELECT 1 FROM orders AS o WHERE o.customer_id = c.id
)
ORDER BY c.id;