إذا تم تحديد SELECT DISTINCT، فلن تبقى في نتيجة الاستعلام إلا الصفوف المميزة. وبذلك، لن يبقى من بين جميع مجموعات الصفوف المتطابقة تمامًا في النتيجة سوى صف واحد فقط.
يمكنك تحديد قائمة الأعمدة التي يجب أن تكون قيمها مميزة: SELECT DISTINCT ON (column1, column2,...). وإذا لم يتم تحديد الأعمدة، فستُؤخذ جميعها في الاعتبار.
لننظر إلى الجدول:
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘استخدام DISTINCT من دون تحديد أعمدة:
SELECT DISTINCT * FROM t1;┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘استخدام DISTINCT مع أعمدة محددة:
SELECT DISTINCT ON (a,b) * FROM t1;┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘DISTINCT و ORDER BY
يدعم ClickHouse استخدام العبارتين DISTINCT و ORDER BY على أعمدة مختلفة ضمن استعلام واحد. وتُنفَّذ العبارة DISTINCT قبل العبارة ORDER BY.
انظر إلى الجدول التالي:
┌─a─┬─b─┐
│ 2 │ 1 │
│ 1 │ 2 │
│ 3 │ 3 │
│ 2 │ 4 │
└───┴───┘اختيار البيانات:
SELECT DISTINCT a FROM t1 ORDER BY b ASC;┌─a─┐
│ 2 │
│ 1 │
│ 3 │
└───┘اختيار البيانات باستخدام اتجاه فرز مختلف:
SELECT DISTINCT a FROM t1 ORDER BY b DESC;┌─a─┐
│ 3 │
│ 1 │
│ 2 │
└───┘تم اقتطاع الصف 2, 4 قبل الفرز.
ضع هذه الخصوصية التنفيذية في الحسبان عند برمجة الاستعلامات.
معالجة NULL
تعمل DISTINCT مع NULL كما لو أن NULL قيمة محددة، وكأن NULL==NULL. وبعبارة أخرى، لا تظهر في نتائج DISTINCT التركيبات المختلفة التي تتضمن NULL إلا مرة واحدة فقط. وهذا يختلف عن طريقة التعامل مع NULL في معظم السياقات الأخرى.
بدائل
يمكن الحصول على النتيجة نفسها بتطبيق GROUP BY على نفس مجموعة القيم المحددة في عبارة SELECT، من دون استخدام أي دوال تجميع. لكن توجد بعض الفروق مقارنةً بنهج GROUP BY: