درآمد کارکنان بیشتر از مدیرانشان | LeetCode | MSSQL

مشکل
با توجه به جدول کارمندان یک شرکت، ما وظیفه داریم یک پرس و جوی SQL بنویسیم تا کارکنانی را که حقوق بیشتری نسبت به مدیران خود دریافت می کنند شناسایی کنیم. هر ردیف در جدول Employee شناسه کارمند، نام، حقوق و شناسه مدیر آنها را ارائه می دهد.
جدول: کارمند
نام ستون | تایپ کنید |
---|---|
شناسه | بین المللی |
نام | varchar |
حقوق | بین المللی |
شناسه مدیر | بین المللی |
راه حل
ما دو راه حل SQL برای این مشکل را بررسی خواهیم کرد. هر یک از آنها رویکرد کمی متفاوت برای شناسایی کارمندانی دارند که درآمد بیشتری نسبت به مدیران خود دارند.
کد منبع 1
اولین قطعه کد از یک تودرتو استفاده می کند SELECT
بیانیه در WHERE
عبارت. پرسش فرعی حقوق مدیر هر کارمند را پیدا می کند و پرس و جو اصلی آن را با حقوق کارمند مقایسه می کند:
SELECT e.name AS Employee
FROM Employee e
WHERE e.salary > (
SELECT m.salary
FROM Employee m
WHERE m.id = e.managerId
)
با زمان اجرا 746 میلی ثانیه، این راه حل 76.97 درصد از راه حل های دیگر را شکست می دهد. این روش می تواند کمی کندتر به دلیل زیرپرسوجوی تو در تو که برای هر کارمند اجرا می شود.
کد منبع 2
راه حل دوم از a استفاده می کند JOIN
بند برای ترکیب ردیف هایی از جدول Employee جایی که کارمند است managerId
با مدیر مطابقت دارد id
. سپس از a استفاده می کند WHERE
بند برای مقایسه حقوق:
SELECT e1.name AS Employee
FROM Employee e1 JOIN Employee e2 ON e1.managerId = e2.id
WHERE e1.salary > e2.salary
این راه حل دارای زمان اجرا سریعتر 662 میلی ثانیه است که 94.99٪ از راه حل های دیگر را شکست می دهد. با استفاده از JOIN
، ما به طور موثر تعداد عملیات را کاهش می دهیم زیرا از اجرای پرس و جوی فرعی برای هر ردیف اجتناب می کنیم.
نتیجه
در حالی که هر دو راه حل پاسخ صحیح را ارائه می دهند، راه حل دوم به دلیل استفاده از آن عملکرد بهتری دارد JOIN
برای جلوگیری از اجراهای متعدد فرعی با این حال، درک این نکته ضروری است که انتخاب روش به الزامات و محدودیتهای خاص پایگاه داده یا سناریوی مشکل شما بستگی دارد.
می توانید مشکل اصلی را در LeetCode پیدا کنید.
برای راهحلهای روشنتر و محتوای مرتبط با فناوری، در صفحه Beacons من با من در ارتباط باشید.