MySQL: difference of two result sets

后端 未结 3 839
暗喜
暗喜 2020-12-08 00:51

How can I get the set difference of two result sets?

Say I have a result set (just one column in each):

result1:
\'a\'
\'b\'
\'c\'

result2:
\'b\'
\'         


        
相关标签:
3条回答
  • 2020-12-08 00:54

    I recently had this requirement where I had to find the difference between two resultsets. Although the above answers helped me wished they were a little detailed. For the given question I found two interpretation:

    1. The resultset could be from 2 different tables
    2. The resultset from the same table

    For the first one where the resultset can be from 2 different tables, let's take two tables: science_student and math_student.


    science_student


    math_student


    I want to calculate the difference between these 2 resultsets, that is:
    result1 - result2
    
    result1: select student_id from science_student where id > 2
    
    result2: select student_id from math_student
    

    The difference between result1 - result2 is STUD3

    So the query to find the difference will be:

    select result1.student_id 
     from 
     (select student_id from science_student where id > 2) result1
     left join
     (select student_id from math_student) result2
     on result1.student_id = result2.student_id 
     where result2.student_id is null;
    



    For the second interpretation where the resultset can be from the same table:

    result1 - result2
    
    result1: select student_id from science_student 
    
    result2: select student_id from science_student where id > 2
    

    The difference between result1 - result2 is STUD1, STUD2

    And the query for the same will be:

    select result1.student_id 
     from 
     (select student_id from science_student) result1
     left join
     (select student_id from science_student where id > 2) result2
     on result1.student_id = result2.student_id 
     where result2.student_id is null;
    
    0 讨论(0)
  • 2020-12-08 01:09

    To perform result1 - result2, you can join result1 with result2, and only output items that exist in result1. For example:

    SELECT DISTINCT result1.column
    FROM result1 LEFT JOIN result2 ON result1.column = result2.column
    WHERE result2.column IS NULL
    

    Note that is not a set difference, and won't output items in result2 that don't exist in result1. It's set subtraction.

    See also: Web archive'd version of relevant blog post.

    0 讨论(0)
  • 2020-12-08 01:11

    If you want things in result1 that are not in result2, what about:

    SELECT distinct result1
    FROM t1 
    WHERE result1 NOT IN (select distinct result2 from t2);
    

    Or:

    SELECT distinct result
    from t1 t
    where NOT EXISTS (select 1 from t2 where result2 = t.result1)
    

    NOTE: if result1 is a subset of result2 then the above queries will return an empty set (they won't show you things in result2 that are not in result1) so they are not set difference, but may be useful too (probably it's more efficient than the outer join).

    0 讨论(0)
提交回复
热议问题