من الممكن أن يكون لديك جملة من أين بفقرة؟
سؤال
هل من الممكن استخدام جملة أين بعد بند؟
أول شيء يأتي إلى ذهني هو استفسارات فرعية، لكنني لست متأكدا.
ملاحظة: إذا كانت الإجابة إيجابية، فهل يمكنك إعطاء بعض الأمثلة؟
المحلول
لا، ليس في نفس الاستعلام.
ال where
جملة يذهب قبل having
و ال group by
. وبعد إذا كنت ترغب في تصفية السجلات قبل تجميع الشرط يذهب في where
جملة، وإذا كنت ترغب في تصفية الخروج من السجلات المجمعة، فإن الشرط يذهب في having
بند:
select ...
from ...
where ...
group by ...
having ...
إذا لم يكن أي من هؤلاء من الممكن استخدامه لبعض الأسباب الفردية، فعليك إجراء استعلام فرعي بحيث يمكنك وضع where
جملة في الاستعلام الخارجي:
select ...
from (
select ...
from ...
where ...
group by ...
having ...
) x
where ...
نصائح أخرى
البند له هو مجرد جملة بعد مجموعة من قبل المجموعة. لماذا لا تضع الظروف الخاصة بك في جملة لها؟
إذا كان هناك سؤال خدعة، فمن الممكن إذا كان المكان والخلال ليس في نفس المستوى، كما ذكرت، مع Sacquery.
أعتقد أن شيئا من هذا القبيل من شأنه أن يعمل
وجود قيمة = (حدد MAX (القيمة) من Foo حيث Crit = 123)
ملاحظة: لماذا كنت تسأل؟ هل لديك مشكلة محددة؟
PSS: موافق سخيفة لي، فاتني علامة "المقابلة *" ...
من تحديد المساعدة
معالجة ترتيب حيث، Group by، وبعد خطوات الخطوات التالية إظهار أمر المعالجة لبيان محدد مع وجود جملة ومجموعة بمجموعة واحدة، وبقرة له:
من جملة إزاد مجموعة نتيجة أولية.
المكان الذي يستثني فيه الصفوف التي لا تلبي شرط البحث.
تقوم المجموعة بقطعة بجمع الصفوف المحددة في مجموعة واحدة لكل قيمة فريدة في جملة المجموعة.
وظائف إجمالية المحددة في قائمة تحديد قيم ملخص لكل مجموعة.
بندات لها باستثناء الصفوف بالإضافة إلى ذلك لا تلبي شرط البحث.
لذلك، لا لا يمكنك.
في نفس النطاق، الإجابة لا. إذا سمحت للندد، يمكنك تجنب استخدام HAVING
تماما.
أظن HAVING
هو مفارقة تاريخية. هيو داروين يشير إلى HAVING
باسم "حماقة الاستفسارات المنظمة":
في SQL القديم،
WHERE
لا يمكن استخدام جملة حول نتائج التجميع، لذلك اضطروا إلى ابتكارHAVING
(بنفس معنىWHERE
):SELECT D#, AVG(Salary) AS Avg_Sal FROM Emp GROUP BY D# HAVING AVG(Salary) > 999;
ولكن هل كان لدينا من أي وقت مضى
HAVING
إذا كان في عام 1979 يمكن للمرء أن يكتب:SELECT * FROM ( SELECT D#, AVG(Sal) AS Avg_Sal FROM Emp GROUP BY D# ) AS dummy WHERE Avg_Sal > 999;
أشك بشدة في أن الإجابة على سؤال داروين لا.