كيف أعالج خطأ إعادة أكثر من صف من استعلام فرعي قياسي؟

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

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

الإجابة

تتوقع المقارنة العادية باستخدام = مع استعلام فرعي قياسي قيمة واحدة من الاستعلام الداخلي. إذا أعاد أكثر من صف، يرفض MySQL تنفيذ المقارنة حتى لو كانت بعض القيم متساوية. لا تختار قاعدة البيانات أول صف تلقائيًا، لأن ذلك سيترك معنى المقارنة غير محدد.

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

مثال

WITH books AS (
  SELECT 1 AS id, 10 AS price
  UNION ALL SELECT 2, 20
)
SELECT id
FROM books
WHERE price = (SELECT MAX(price) FROM books);

إضافة LIMIT 1 دون ترتيب ليست إصلاحًا عامًا؛ فهي قد تخفي المشكلة وتختار قيمة لا تعبّر عن السؤال الأصلي. يجب أولًا تحديد معنى القيمة المطلوبة.

باختصار: عالج تعدد الصفوف باختيار بنية تعكس المطلوب، مثل تجميع محدد أو اختبار عضوية أو شرط يضمن التفرد.

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

اختبر فهمك

الهدف اختيار جميع الكتب ذات أعلى سعر. أي بديل يصحح الاستعلام مع الحفاظ على الكتب المتعادلة؟

CREATE TABLE books (
  id INT PRIMARY KEY,
  price INT NOT NULL
);
INSERT INTO books (id, price) VALUES (1, 10), (2, 20), (3, 20);

-- الاستعلام المراد تصحيحه
SELECT id FROM books
WHERE price = (SELECT price FROM books);