sql 交集 差集

-- 使用not exists 获取差集
SELECT  s.id FROM  TABLES s WHERE
    NOT EXISTS (
        SELECT 1 FROM  tableM m  WHERE  m.tableS_id = s.id
    )
ORDER BY  s.id ASC;

-- 使用left join获取差集
SELECT s.id FROM TABLES s
LEFT JOIN tableM m ON m.tableS_id = s.id
WHERE m.tableS_id IS NULL
ORDER BY s.id ASC;

-- 使用union all获取差集
SELECT c.id FROM (
        SELECT s.id AS id FROM TABLES s
        UNION ALL (
                SELECT m.tableS_id AS id FROM tableM m
            )

) c
GROUP BY c.id HAVING COUNT(c.id) = 1;

-- 使用 exists 获取交集
SELECT s.id FROM TABLES s
WHERE EXISTS (
        SELECT 1 FROM tableM m WHERE m.tableS_id = s.id
    )
ORDER BY s.id ASC;

-- 使用left join 获取交集
SELECT DISTINCT s.id FROM TABLES s
LEFT JOIN tableM m ON m.tableS_id = s.id
WHERE m.tableS_id IS NOT NULL
ORDER BY s.id ASC;

-- 使用inner join 获取交集
SELECT DISTINCT s.id FROM TABLES s
INNER JOIN tableM m ON m.tableS_id = s.id
ORDER BY s.id ASC;

-- 使用union all获取交集
SELECT c.id FROM (
        SELECT s.id AS id FROM TABLES s
        UNION ALL  (
                SELECT m.tableS_id AS id FROM tableM m
            )
    ) c
GROUP BY c.id HAVING COUNT(c.id) > 1

 

-- 如果是oracle数据库,可使用minus和intersect函数分别获取差集和并集,示例如下:

-- 使用minus获取差集
SELECT s.id FROM TABLES s
minus
SELECT  m.tableS_id FROM tableM m
ORDER BY s.id ASC;

-- intersect获取交集
SELECT s.id FROM TABLES s
intersect
SELECT m.tableS_id FROM tableM m
ORDER BY s.id ASC;

转载于:https://my.oschina.net/kevin2kelly/blog/888116

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值