{x}
blog image

Students With Invalid Departments

Solution Explanation for LeetCode 1350: Students With Invalid Departments

This problem requires finding students enrolled in departments that don't exist in the Departments table. Two SQL approaches effectively solve this: using a subquery (Solution 1) and using a LEFT JOIN (Solution 2).

Solution 1: Subquery Approach

This approach uses a subquery within the WHERE clause to identify invalid department IDs.

MySQL Code:

SELECT id, name
FROM Students
WHERE department_id NOT IN (SELECT id FROM Departments);

Explanation:

  1. SELECT id, name FROM Students: This selects the id and name columns from the Students table.
  2. WHERE department_id NOT IN (SELECT id FROM Departments): This filters the results. The subquery (SELECT id FROM Departments) retrieves all existing department IDs. The outer query then selects only those students whose department_id is not present in the list of valid department IDs returned by the subquery.

Time Complexity: The time complexity depends on the database engine's query optimization. However, in the worst-case scenario, it involves a full table scan of both tables. This leads to an O(M*N) time complexity where M and N are the number of rows in Students and Departments tables respectively. If the database uses indexes efficiently, the complexity can be improved significantly, potentially down to O(M + N) or even better.

Space Complexity: The space complexity is relatively low and primarily depends on the size of the result set, which is O(K), where K is the number of students in invalid departments.

Solution 2: LEFT JOIN Approach

This approach uses a LEFT JOIN to combine the Students and Departments tables. Students with invalid department IDs will have a NULL value in the corresponding Departments columns.

MySQL Code:

SELECT s.id, s.name
FROM
    Students AS s
    LEFT JOIN Departments AS d ON s.department_id = d.id
WHERE d.id IS NULL;

Explanation:

  1. SELECT s.id, s.name: Selects the id and name from the Students table (aliased as s).
  2. FROM Students AS s LEFT JOIN Departments AS d ON s.department_id = d.id: Performs a LEFT JOIN between Students and Departments. A LEFT JOIN returns all rows from the left table (Students) and matching rows from the right table (Departments). If there's no match in Departments, the columns from Departments will have NULL values.
  3. WHERE d.id IS NULL: Filters the results to include only rows where the id column from the Departments table (d.id) is NULL. This indicates that the student's department_id doesn't exist in the Departments table.

Time Complexity: Similar to Solution 1, the time complexity is highly dependent on the database engine's query optimization. A worst-case scenario would be O(M*N). However, with efficient indexing, it can achieve O(M + N) complexity.

Space Complexity: The space complexity is O(K), where K is the number of students enrolled in non-existent departments. This is because it only stores the result set in memory.

Summary:

Both solutions achieve the same outcome. The LEFT JOIN approach is generally considered more efficient and readable for this type of problem, particularly when dealing with larger datasets, as it allows the database engine to potentially utilize indexes more effectively. However, the actual performance depends greatly on the specific database system and its optimization strategies.