ORACLE:求两条query语句的并集、交集、差集

382 阅读1分钟

计划更文 2/100

  1. 查询两条query语句的并集:UNIONUNION ALL
  • UNION

    这个查询将返回两个查询结果集的并集,并消除重复记录。

    SELECT c1, c2 FROM table1 WHERE condition1  -- query1
    UNION
    SELECT c1, c2 FROM table2 WHERE condition2  -- query2
    
  • UNION ALL

    如果想保留重复记录,可以使用“UNION ALL

    SELECT c1, c2 FROM table1 WHERE condition1  -- query1
    UNION ALL
    SELECT c1, c2 FROM table2 WHERE condition2  -- query2
    

    注意:为了使 UNIONUNION ALL 操作有效,query1和query2查询结果的列数和数据类型必须相同。

  1. 查询两条query语句的交集:INTERSECT

    -- 返回‘query1’和‘query2’结果集中的共同记录。两者的结果集的列数和数据类型必须相同
    SELECT c1, c2 FROM table1 WHERE condition1
    INTERSECT
    SELECT c1, c2 FROM table2 WHERE condition2;
    

    注意:"INTERSECT"在某些数据库中可能不受支持,例如MySQL。在不支持的数据库中,可以使用“INNER JOIN”或者“EXISTS”子句来实现类似的功能。

  2. 查询两条query语句的差集:MINUS

    -- 这个查询将返回'query1'存在但'query2'中不存在的记录
    SELECT c1, c2 FROM table1 WHERE condition1  -- query1
    MINUS
    SELECT c1, c2 FROM table2 WHERE condition2; -- query2 
    

    注意:在MySQL中,没有“MINUS”操作符。在MySQL中,可以使用“LEFT JOIN”或者“NOT EXISTS”子句来实现类似的功能。

    -- MySQL中使用‘NOT EXISTS’子句或‘LEFT JOIN’
    SELECT c1, c2 
    FROM table1 
    WHERE condition1 
    AND NOT EXISTS ( 
        SELECT c1, c2 
        FROM table2 
        WHERE condition2
    );