شناسه کارمند را با شناسه منحصربفرد جایگزین کنید LeetCode | MSSQL

مشکل
این مشکل شامل دو جدول است، Employees
و EmployeeUNI
.
جدول: کارمندان
نام ستون | تایپ کنید |
---|---|
شناسه | بین المللی |
نام | varchar |
در این جدول، id
کلید اولیه است. هر ردیف شامل شناسه و نام یک کارمند در یک شرکت است.
جدول: EmployeeUNI
نام ستون | تایپ کنید |
---|---|
شناسه | بین المللی |
شناسه منحصر به فرد | بین المللی |
کامپوزیت (id, unique_id)
کلید اصلی این جدول است. هر ردیف شامل شناسه و شناسه منحصربفرد مربوط به یک کارمند در شرکت است.
وظیفه این است که یک پرس و جوی SQL بنویسید تا شناسه منحصر به فرد هر کاربر را نشان دهد. اگر کاربری یک شناسه منحصر به فرد ندارد، فقط NULL را نشان دهید. نتیجه را می توان به هر ترتیبی برگرداند.
توضیح
بیایید داده های ورودی زیر را در نظر بگیریم:
جدول کارکنان:
شناسه | نام |
---|---|
1 | آلیس |
7 | باب |
11 | میر |
90 | وینستون |
3 | جاناتان |
جدول EmployeeUNI:
شناسه | شناسه منحصر به فرد |
---|---|
3 | 1 |
11 | 2 |
90 | 3 |
شناسه منحصر به فرد از Meir
2 است، Winston
3 است و Jonathan
1 است. Alice
و Bob
شناسه های منحصر به فرد ندارند
بنابراین خروجی مورد انتظار عبارت است از:
شناسه منحصر به فرد | نام |
---|---|
خالی | آلیس |
خالی | باب |
2 | میر |
3 | وینستون |
1 | جاناتان |
راه حل
راه های مختلفی برای حل این مشکل وجود دارد. ما چهار رویکرد مختلف را مورد بحث قرار خواهیم داد که از انواع مختلف عملیات JOIN و مدیریت NULL استفاده می کنند. هر روشی از نظر خوانایی، مقیاس پذیری و سرعت اجرا مزایا و معایب خاص خود را دارد.
کد منبع 1
روش اول از یک عملیات LEFT JOIN استفاده می کند Employees
به EmployeeUNI
بر id
. اگر یک کارمند یک شناسه منحصربهفرد نداشته باشد (یعنی ردیف مربوطه در آن وجود نداشته باشد EmployeeUNI
) ISNULL
تابع جایگزین گمشده می شود unique_id
با NULL.
SELECT
u.unique_id,
ISNULL(e.name, NULL) [name]
FROM Employees e LEFT JOIN EmployeeUNI u ON u.id = e.id
زمان اجرا برای این راه حل 3010 میلی ثانیه است که 5.40 درصد از ارسال ها در LeetCode را شکست می دهد.
کد منبع 2
روش دوم از یک RIGHT JOIN استفاده می کند EmployeeUNI
به Employees
بر id
. را ISNULL
از تابع برای رسیدگی به نامهای گمشده استفاده میشود که ممکن است در این صورت لازم نباشد Employees
کامل است (یعنی همه کارمندان شامل Employees
جدول).
SELECT
u.unique_id,
ISNULL(e.name, NULL) [name]
FROM EmployeeUNI u RIGHT JOIN Employees e ON u.id = e.id
این راه حل سریعتر از راه حل قبلی با زمان اجرا 2277 میلی ثانیه عمل می کند و 26.40 درصد از ارسال ها در LeetCode را شکست می دهد.
کد منبع 3
رویکرد سوم از یک عملیات LEFT JOIN مشابه اولین مورد استفاده میکند، اما آن را حذف میکند ISNULL
عملکرد، با این فرض Employees
کامل است.
SELECT
eu.unique_id,
e.name
FROM Employees e LEFT JOIN EmployeeUNI eu ON e.id = eu.id
این راه حل دارای زمان اجرا 3314 میلی ثانیه است که 5.2 درصد از موارد ارسالی در LeetCode را شکست می دهد.
کد منبع 4
راه حل چهارم مشابه رویکرد دوم است اما بدون آن ISNULL
عملکرد، با این فرض Employees
کامل است.
SELECT
u.unique_id,
e.name
FROM EmployeeUNI u RIGHT JOIN Employees e ON u.id = e.id
این راه حل دارای زمان اجرا 2093 میلی ثانیه است که 43.45 درصد از موارد ارسالی در LeetCode را شکست می دهد.
نتیجه
هر یک از راه حل های بالا پاسخ معتبری به مشکل ارائه می دهد، البته با نتایج عملکرد متفاوت در LeetCode.
با توجه به معیارهای LeetCode، راه حل چهارم (کد منبع 4) بهترین عملکرد را دارد، سپس راه حل دوم (کد منبع 2)، سپس راه حل اول (کد منبع 1) و در نهایت راه حل سوم (کد منبع 3) قرار می گیرد. . با این حال، توجه به این نکته مهم است که در سناریوهای دنیای واقعی، عملکرد ممکن است بر اساس RDBMS خاص و ساختار پایگاه داده و حجم داده متفاوت باشد.
می توانید مشکل اصلی را در LeetCode پیدا کنید.
برای راهحلهای روشنتر و محتوای مرتبط با فناوری، در صفحه Beacons من با من در ارتباط باشید.