برنامه نویسی

شناسه کارمند را با شناسه منحصربفرد جایگزین کنید 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 را شکست می دهد.

s1

کد منبع 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 را شکست می دهد.

s2

کد منبع 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 را شکست می دهد.

s3

کد منبع 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 را شکست می دهد.

s4

نتیجه

هر یک از راه حل های بالا پاسخ معتبری به مشکل ارائه می دهد، البته با نتایج عملکرد متفاوت در LeetCode.

با توجه به معیارهای LeetCode، راه حل چهارم (کد منبع 4) بهترین عملکرد را دارد، سپس راه حل دوم (کد منبع 2)، سپس راه حل اول (کد منبع 1) ​​و در نهایت راه حل سوم (کد منبع 3) قرار می گیرد. . با این حال، توجه به این نکته مهم است که در سناریوهای دنیای واقعی، عملکرد ممکن است بر اساس RDBMS خاص و ساختار پایگاه داده و حجم داده متفاوت باشد.

می توانید مشکل اصلی را در LeetCode پیدا کنید.

برای راه‌حل‌های روشن‌تر و محتوای مرتبط با فناوری، در صفحه Beacons من با من در ارتباط باشید.

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

@ranggakd | خلاصه خلاصه جزئیات مرکز اوه سلام، من یک برنامه نویس هستم.

فاویکون
beacons.ai

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا