• exists语句使用的两个例子:


    案例一:

    现在有表A、AA、AAA

    业务如下:

    A、AA、AAA三个表依次是父子关系,即A是AA的父表、AA是AAA的父表

    现做如下的假设:

    A  ->库房

    AA->商品表,其中应用了库房的ID

    AAA->出库表,其中引用了商品的ID

    现在查询表中的那条记录是属于出库完毕:

    库房出库完毕是指当前库房下的每个商品他对应的数量等于每个商品对于的出库记录之和都相等。

    以下是表结构和初始数据:

    create table TESTPAC.A
    (
      id VARCHAR2(32)
    )
    --
    create table TESTPAC.AA
    (
      id   VARCHAR2(32),
      a_id VARCHAR2(32),
      quty NUMBER
    )
    --
    create table TESTPAC.AAA
    (
      id    VARCHAR2(32),
      aa_id VARCHAR2(32),
      quty  NUMBER
    )
    --
    create table TESTPAC.B
    (
      id   VARCHAR2(32),
      a_id VARCHAR2(32)
    )

    初始化数据:

    A:

    AA:

    AAA:

    以下是EXISTS语句:

    意思是在AA表中不存在数量与子表的数量之和不相等的,即全部都相等:

    1 SELECT *
    2   FROM a
    3  WHERE NOT EXISTS
    4  (SELECT *
    5           FROM aa
    6          WHERE aa.a_id = a.id
    7            AND aa.quty !=
    8                (SELECT nvl(SUM(aaa.quty), 0) FROM aaa WHERE aaa.aa_id = aa.id))

    结果:

    案例二:

    现有用户表USERS和部门表DEPT,在添加用户的过程中,需要填写用户所在的部门,

    现在需要查询存在于当前节点和当前节点下的所有的子部门中的用户。

    表定义如下:

    create table DEPT
    (
      id        VARCHAR2(32),
      dept_name VARCHAR2(32),
      p_id      VARCHAR2(32)
    )
    --
    -- Create table
    create table USERS
    (
      id       VARCHAR2(32),
      username VARCHAR2(32),
      dept_id  VARCHAR2(32)
    )

    DEPT表中的数据:

    1 SELECT lpad(' ', LEVEL * 5) || dept_name
    2   FROM dept t
    3  START WITH t.p_id = 'ROOT'
    4 CONNECT BY PRIOR t.id = t.p_id;

    USERS表中的数据:

    EXISTS语句如下:

    1、查询当前节点和其子节点的数据:

    1 SELECT t.*,
    2        t.rowid
    3   FROM users t
    4  WHERE EXISTS (SELECT NULL
    5           FROM (SELECT id
    6                   FROM dept t
    7                  START WITH t.id = 'AA1'
    8                 CONNECT BY PRIOR t.id = t.p_id) cols
    9          WHERE cols.id = t.dept_id)

    2、根据页面的是否选择子节点的标志位,整合到一个SQL语句中:

     1 SELECT t.*,
     2        t.rowid
     3   FROM users t
     4  WHERE EXISTS
     5  (SELECT NULL
     6           FROM (SELECT id
     7                   FROM dept t
     8                  WHERE t.id =
     9                        decode(:是否包含子节点的数据的标志位,'Y' :传递的id, t.id)
    10                  START WITH t.id = 'AA1'
    11                 CONNECT BY PRIOR t.id = t.p_id) cols
    12          WHERE cols.id = t.dept_id)

    --完!

  • 相关阅读:
    Windows删除git本地记住的密码
    C++ fmt库的安装和测试
    仿照struct is_integral 实现struct not_int
    folly库net库udp小例子
    Java阻塞队列BlockingQueue
    正则表达式必知必会摘要
    正则表达式匹配IP地址
    SimpleDateFormat线程安全性测试与解决方案
    Java8 HashMap中哈希桶(table)数组的索引位置
    socket网络编程--基础应用篇
  • 原文地址:https://www.cnblogs.com/caroline/p/2748782.html
Copyright © 2020-2023  润新知