qq260711363 2018-12-25 11:02 采纳率: 0%
浏览 1100

请大神帮忙SQL改写,not exists 改写成 外连接

这个是Oracle的示例表,emp,dept。分别是14条和4条记录,c表2条。14x4x2=112条记录,这个c表中的manager和7839在emp表中是存在的,所以减去存在的3条记录,最后是109条记录。

目的是通过笛卡尔积补充数据。

其实我在做优化,只是不知道这个怎么改,真的好难啊。
a表1.5亿数据,b表13,c表2。这是40多亿的数据,然后在从中拿不存在的,

SELECT a.empno, a.deptno, a.ename, a.sal, c.job, c.mgr, b.deptno
  FROM (SELECT DISTINCT empno, deptno, ename, sal FROM emp) a,
       dept b,
       (SELECT 'MANAGER' AS job, '9999' AS mgr
          FROM dual
        UNION ALL
        SELECT 'MANAGER' AS job, '7839' AS mgr
          FROM dual) c
 WHERE NOT EXISTS (SELECT 1
          FROM emp t
         WHERE t.empno = a.empno
           AND t.deptno = a.deptno
           AND t.ename = a.ename
           AND t.sal = a.sal
           AND t.job = c.job
           AND t.mgr = c.mgr
           AND t.deptno = b.deptno);

怎么改写成外连接,保证数据量一样

新人没有币,见谅。

  • 写回答

4条回答 默认 最新

  • 孤独不是寂寞 2018-12-25 03:27
    关注

    我sql水平也一般,不知道写的对不对,没法测试,主要不清楚表结构和你sql语句的目的。
    SELECT
    a.empno,
    a.deptno,
    a.ename,
    a.sal,
    c.job,
    c.mgr,
    b.deptno
    FROM
    emp t
    INNER JOIN (SELECT DISTINCT empno,deptno,ename,sal FROM emp) a ON t.empno != a.empno AND t.deptno != a.deptno AND t.ename != a.ename AND t.sal != a.sal
    INNER JOIN dept b ON t.deptno != b.deptno
    INNER JOIN (SELECT 'MANAGER' AS job,'9999' AS mgr FROM dual UNION ALL SELECT 'MANAGER' AS job,'7839' AS mgr FROM dual) c ON t.job != c.job AND t.mgr != c.mgr

    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?