SQL分层查询

数据中可能存在层次关系,本文章主要介绍查询这种关系的实例。会大量使用递归式 CTE

   Emps 表中 EName 员工和 MGR 上级之间的关系如下:

  

   每个上级也同样是员工,主管和员工之间为父子关系。

1.呈现父子关系

  情景:返回员工数据的同时返回上级信息(名字,角色,薪水)。如下:

  

   解决方案:基于 MGR 和 EName 相等自连接,找出每个员工上级的数据即可解决。

SELECT a.EName 员工名,a.MGR 上级,b.SAL 上级薪水,B.Role 上级角色 FROM test.emps a
left join test.emps b on a.MGR = b.EName

  也可以使用标量子查询,注意标量子查询只能返回一列。

 select a.EName 员工名, 
 (select b.EName FROM test.emps b where b.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的分层查询代码示例: DAO层: ```java public class CarDAO { //数据库连接对象 private Connection conn; public CarDAO(Connection conn) { this.conn = conn; } //查询单条车辆信息 public Car queryByPlateNumber(String plateNumber) throws SQLException { String sql = "SELECT * FROM car WHERE plate_number = ?"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, plateNumber); try (ResultSet rs = pstmt.executeQuery()) { if (rs.next()) { return new Car(rs.getInt("id"), rs.getString("plate_number"), rs.getString("type"), rs.getString("owner_name"), rs.getString("contact")); } else { return null; } } } } //查询所有车辆信息 public List<Car> queryAll() throws SQLException { String sql = "SELECT * FROM car"; try (PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery()) { List<Car> cars = new ArrayList<>(); while (rs.next()) { cars.add(new Car(rs.getInt("id"), rs.getString("plate_number"), rs.getString("type"), rs.getString("owner_name"), rs.getString("contact"))); } return cars; } } } ``` Service层: ```java public class CarService { //DAO层对象 private CarDAO carDAO; public CarService(CarDAO carDAO) { this.carDAO = carDAO; } //查询单条车辆信息 public Car queryByPlateNumber(String plateNumber) throws SQLException { if (isValidPlateNumber(plateNumber)) { return carDAO.queryByPlateNumber(plateNumber); } else { throw new IllegalArgumentException("Invalid plate number"); } } //查询所有车辆信息 public List<Car> queryAll() throws SQLException { return carDAO.queryAll(); } //校验车牌号是否合法 private boolean isValidPlateNumber(String plateNumber) { //这里省略校验逻辑 return true; } } ``` Controller层: ```java public class CarController { //Service层对象 private CarService carService; public CarController(CarService carService) { this.carService = carService; } //查询单条车辆信息 public void queryByPlateNumber(String plateNumber) { try { Car car = carService.queryByPlateNumber(plateNumber); //渲染结果到前端页面 } catch (SQLException e) { //处理异常 } catch (IllegalArgumentException e) { //处理异常 } } //查询所有车辆信息 public void queryAll() { try { List<Car> cars = carService.queryAll(); //渲染结果到前端页面 } catch (SQLException e) { //处理异常 } } } ``` 在实际开发中,还需要考虑异常处理、日志记录、事务管理等方面的问题,这里只是一个简单的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值