【SQL练习】要求编写SQL语句查询(company, agencyid, orderno)组合键值重复的记录明细.

要求编写SQL语句查询(company, agencyid, orderno)组合键值重复的记录明细.

在这里插入图片描述

create table tab4(
       company varchar(10),
       agencyid varchar(10),
       orderno varchar(8),
       productid varchar(3),
       producttype1 varchar(2),
       producttype2 varchar(2),
       CONSTRAINT PK_TAB4 PRIMARY KEY (company, agencyid, orderno, productid) 
);
insert into tab4 (company, agencyid, orderno, productid, producttype1, producttype2) 
values ('平安', '100', '1002345', '001', '01', '02');
insert into tab4 (company, agencyid, orderno, productid, producttype1, producttype2) 
values ('平安', '100', '1002345', '002', '01', '02');
insert into tab4 (company, agencyid, orderno, productid, producttype1, producttype2) 
values ('平安', '100', '1002345', '003', '01', '02');
insert into tab4 (company, agencyid, orderno, productid, producttype1, producttype2) 
values ('平安', '120', '1002345', '004', '01', '02');
insert into tab4 (company, agencyid, orderno, productid, producttype1, producttype2) 
values ('平安', '130', '1002345', '001', '01', '02');
commit;

在这里插入图片描述

with temp as
 (select t.company, t.agencyid, t.orderno, count(1)
    from tab4 t
   group by t.company, t.agencyid, t.orderno
  having count(1) >= 2)
select t2.*
  from tab4 t2
 inner join temp
    on t2.company = temp.company
   and t2.agencyid = temp.agencyid
   and t2.orderno = temp.orderno;

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.hvlink.mapper.order.TbOrderMainMapper"> <!-- 其他 insert/update 不变 --> <insert id="batchInsert"> INSERT INTO tb_order_main( company_code, purchase_order_no, publish_date, supplier_code, factory_code, warehouse_code, create_time, serial_version_num, order_type ) VALUES <foreach collection="list" item="item" separator=","> ( #{item.companyCode}, #{item.purchaseOrderNo}, #{item.publishDate}, #{item.supplierCode}, #{item.factoryCode}, #{item.warehouseCode}, GETDATE(), #{item.serialVersionNum}, #{item.orderType} ) </foreach> </insert> <update id="batchUpdate"> UPDATE tb_order_main SET update_time = GETDATE(), publish_date = <foreach collection="list" item="item" index="index" separator=" " open="CASE ID" close="END"> WHEN #{item.id} THEN #{item.publishDate} </foreach>, serial_version_num = <foreach collection="list" item="item" index="index" separator=" " open="CASE ID" close="END"> WHEN #{item.id} THEN #{item.serialVersionNum} </foreach> WHERE id IN <foreach collection="list" item="item" open="(" close=")" separator=","> #{item.id} </foreach> </update> <!-- 主查询:采购订单分页 --> <select id="queryPurchaseOrderPage" resultType="com.hvlink.entity.dto.order.PurchaseOrderMainDTO"> SELECT m.id, m.company_code, m.purchase_order_no, m.publish_date, s.supplier_code, s.supplier_name, f.factory_code, f.factory_name, w.warehouse_code, w.warehouse_name, m.serial_version_num, m.order_type FROM tb_order_main m LEFT JOIN tm_supplier s ON m.supplier_code = s.supplier_code LEFT JOIN tm_factory f ON m.factory_code = f.factory_code LEFT JOIN tm_warehouse w ON m.warehouse_code = w.warehouse_code <where> <!-- 固定条件 --> m.is_deleted = 0 <!-- 模糊匹配组:供应商/工厂/仓库 名称或编码中任一匹配 --> <if test="param.supplierName != null and param.supplierName != '' or param.supplierCode != null and param.supplierCode != '' or param.factoryName != null and param.factoryName != '' or param.factoryCode != null and param.factoryCode != '' or param.warehouseName != null and param.warehouseName != '' or param.warehouseCode != null and param.warehouseCode != ''"> AND ( <!-- 供应商名称 --> <if test="param.supplierName != null and param.supplierName != ''"> s.supplier_name LIKE CONCAT('%', #{param.supplierName}, '%') </if> <if test="param.supplierName != null and param.supplierName != '' and param.supplierCode != null and param.supplierCode != ''"> OR </if> <!-- 供应商编码 --> <if test="param.supplierCode != null and param.supplierCode != ''"> s.supplier_code LIKE CONCAT('%', #{param.supplierCode}, '%') </if> <!-- 工厂名称 --> <if test="(param.supplierName != null or param.supplierCode != null) and (param.factoryName != null or param.factoryCode != null)"> OR </if> <if test="param.factoryName != null and param.factoryName != ''"> f.factory_name LIKE CONCAT('%', #{param.factoryName}, '%') </if> <if test="param.factoryName != null and param.factoryName != '' and param.factoryCode != null and param.factoryCode != ''"> OR </if> <!-- 工厂编码 --> <if test="param.factoryCode != null and param.factoryCode != ''"> f.factory_code LIKE CONCAT('%', #{param.factoryCode}, '%') </if> <!-- 仓库名称 --> <if test="(param.factoryName != null or param.factoryCode != null) and (param.warehouseName != null or param.warehouseCode != null)"> OR </if> <if test="param.warehouseName != null and param.warehouseName != ''"> w.warehouse_name LIKE CONCAT('%', #{param.warehouseName}, '%') </if> <if test="param.warehouseName != null and param.warehouseName != '' and param.warehouseCode != null and param.warehouseCode != ''"> OR </if> <!-- 仓库编码 --> <if test="param.warehouseCode != null and param.warehouseCode != ''"> w.warehouse_code LIKE CONCAT('%', #{param.warehouseCode}, '%') </if> ) </if> <!-- 订单号模糊查询 --> <if test="param.purchaseOrderNo != null and param.purchaseOrderNo != ''"> AND m.purchase_order_no LIKE CONCAT('%', #{param.purchaseOrderNo}, '%') </if> <!-- 订单类型 --> <if test="param.orderType != null"> AND m.order_type = #{param.orderType} </if> <!-- 明细字段关联查询 --> <if test="param.partCode != null and param.partCode != ''"> AND EXISTS ( SELECT 1 FROM tb_order_detail d WHERE d.purchase_order_no = m.purchase_order_no AND d.company_code = m.company_code AND d.serial_version_num = m.serial_version_num AND d.order_type = m.order_type AND d.part_code LIKE CONCAT('%', #{param.partCode}, '%') ) </if> <if test="param.partDesc != null and param.partDesc != ''"> AND EXISTS ( SELECT 1 FROM tb_order_detail d WHERE d.purchase_order_no = m.purchase_order_no AND d.company_code = m.company_code AND d.serial_version_num = m.serial_version_num AND d.order_type = m.order_type AND d.part_desc LIKE CONCAT('%', #{param.partDesc}, '%') ) </if> <if test="param.frequency != null and param.frequency != ''"> AND EXISTS ( SELECT 1 FROM tb_order_detail d WHERE d.purchase_order_no = m.purchase_order_no AND d.company_code = m.company_code AND d.serial_version_num = m.serial_version_num AND d.order_type = m.order_type AND d.frequency = #{param.frequency} ) </if> <if test="param.type != null"> AND EXISTS ( SELECT 1 FROM tb_order_detail d WHERE d.purchase_order_no = m.purchase_order_no AND d.company_code = m.company_code AND d.serial_version_num = m.serial_version_num AND d.order_type = #{param.orderType} ) </if> <!-- 版本类型:1=最新版 --> <if test="param.versionType != null and param.versionType == 1"> AND m.serial_version_num = ( SELECT MAX(serial_version_num) FROM tb_order_main WHERE purchase_order_no = m.purchase_order_no AND company_code = m.company_code ) </if> </where> ORDER BY m.create_time DESC </select> <!-- 明细查询 --> <select id="queryDetailsByCompositeKeys" resultType="com.hvlink.entity.dto.order.PurchaseOrderDetailsDTO"> SELECT d.purchase_order_no, d.line_no, d.delivery_date, d.part_code, d.part_desc, d.unit, d.total_qty, d.required_qty, d.available_qty, d.shipped_qty, d.type, d.frequency, d.approval_code, d.serial_version_num, d.company_code, d.order_type FROM tb_order_detail d WHERE <foreach collection="keys" item="key" separator=" OR "> (d.purchase_order_no = LEFT(#{key}, CHARINDEX('#', #{key}) - 1) AND d.factory_code = SUBSTRING(#{key}, CHARINDEX('#', #{key}) + 1, LEN(#{key}))) </foreach> ORDER BY d.purchase_order_no, d.line_no </select> </mapper> @Override public PageResult<PurchaseOrderMainVO> queryPage(PurchaseOrderParam purchaseOrderParam) { // 查询主表数据 Page<PurchaseOrderMainDTO> page = new Page<>(purchaseOrderParam.getPageIndex(), purchaseOrderParam.getPageSize()); Page<PurchaseOrderMainDTO> mainPage = orderMainMapper.queryPurchaseOrderPage(page, purchaseOrderParam); if (CollectionUtils.isEmpty(mainPage.getRecords())) { return null; } // // 提取采购订单号、公司代码用于关联查询明细 // List<String> orderNos = new ArrayList<>(); // List<String> companyCodes = new ArrayList<>(); //// List<String> serialVersionNums = new ArrayList<>(); // // for (PurchaseOrderMainDTO mainDTO : mainPage.getRecords()) { // orderNos.add(mainDTO.getPurchaseOrderNo()); // companyCodes.add(mainDTO.getFactoryCode()); // } // 查询明细数据 // 提取采购订单号、公司代码用于关联查询明细 List<String> keys = new ArrayList<>(); for (PurchaseOrderMainDTO mainDTO : mainPage.getRecords()) { String key = mainDTO.getPurchaseOrderNo() + "#" + mainDTO.getFactoryCode(); keys.add(key); } List<PurchaseOrderDetailsDTO> detailList = orderMainMapper.queryDetailsByCompositeKeys(keys); // 按采购订单号分组明细数据 Map<String, List<PurchaseOrderDetailsDTO>> detailMap = detailList.stream() .collect(Collectors.groupingBy(detail -> detail.getPurchaseOrderNo())); // 转换主表数据到VO List<PurchaseOrderMainVO> mainVOList = mainPage.getRecords().stream().map(mainDTO -> { PurchaseOrderMainVO mainVO = BeanCopyUtils.copyBean(mainDTO, PurchaseOrderMainVO.class); mainVO.setSpliceSupplierName(mainDTO.getSupplierCode() + " - " + mainDTO.getSupplierName()); mainVO.setSpliceFactoryName(mainDTO.getFactoryCode() + " - " + mainDTO.getFactoryName()); mainVO.setSpliceWarehouseName(mainDTO.getWarehouseCode() + " - " + mainDTO.getWarehouseName()); // 设置订单类型描述 if (mainDTO.getOrderType() != null) { PurchaseOrderTypeEnum typeEnum = Arrays.stream(PurchaseOrderTypeEnum.values()) .filter(e -> e.getTypeCode().equals(mainDTO.getOrderType())) .findFirst() .orElse(null); if (typeEnum != null) { mainVO.setType(typeEnum.getTypeCode()); } } // 设置明细数据 String detailKey = mainDTO.getPurchaseOrderNo() + "#" + mainDTO.getFactoryCode(); List<PurchaseOrderDetailsVO> detailVOList = new ArrayList<>(); if (detailMap.containsKey(detailKey)) { detailVOList = detailMap.get(detailKey).stream().map(detail -> { PurchaseOrderDetailsVO detailVO = BeanCopyUtils.copyBean(detail, PurchaseOrderDetailsVO.class); // 设置类型名称 if (detail.getType() != null) { PurchaseOrderPlanTypeEnum planTypeEnum = Arrays.stream(PurchaseOrderPlanTypeEnum.values()) .filter(e -> e.getTypeCode().equals(detail.getType())) .findFirst() .orElse(null); if (planTypeEnum != null) { detailVO.setTypeName(planTypeEnum.getTypeDesc()); } } return detailVO; }).collect(Collectors.toList()); } mainVO.setDetailsList(detailVOList); return mainVO; }).collect(Collectors.toList()); // 构建分页结果 PageResult<PurchaseOrderMainVO> result = new PageResult<>(); result.setRecords(mainVOList); result.setTotal(mainPage.getTotal()); result.setPageIndex(purchaseOrderParam.getPageIndex()); result.setPageSize(purchaseOrderParam.getPageSize()); return result; List<PurchaseOrderDetailsDTO> queryDetailsByCompositeKeys(@Param("keys") List<String> keys); 修改为只使用采购订单一个字段作为查询明细表的条件
09-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值