一个博友的SQL问题解决过程

简介:
一个博友的SQL问题解决过程
 
环境
 
DB2 9.1
 
问题
 
有两张表,一个产品表,一个价格表,一对多关系(一个产品可以对应多个价格),要求输出结果为 产品 当前有效价格,优惠价格(原价-当前有效价格),不符合关联的条件的记录剔除,并排序。
 
建表SQL
 
CREATE TABLE PRODUCT(PRODID INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY, PFORMPRICE DECIMAL(16,2),PDESC VARCHAR(50), PRIMARY KEY(PRODID));
CREATE TABLE PRICE(PRICEID INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY, PRRFNBR INT NOT NULL,PPRE INT NOT NULL,PRICE DECIMAL(16,2),PRIMARY KEY(PRICEID));
INSERT INTO PRODUCT(PFORMPRICE,PDESC) VALUES(10,'PROD1'),(20,'PROD2'),(30,'PROD3');
INSERT INTO PRICE(PRRFNBR,PPRE,PRICE) VALUES(1,1,1),(1,2,3),(1,3,2),(2,1,3),(2,2,2);
说明:
PRODUCT:  PRODUCTID(主键),PFORMPRICE(商品原价),PDESC(商品描述)
PRICE:  PRICEID(主键),PRRFNBR(A表主键),PPRE(价格优先级,此优先级最高的为当前有效价格),PRICE(价格)
 
数据如下
 
SELECT * FROM PRODUCT;
------------------------------------------
1
10.00
PROD1
2
20.00
PROD2
3
30.00
PROD3
SELECT * FROM PRICE;
------------------------------------------
1
1
1
1.00
2
1
2
3.00
3
1
3
2.00
4
2
1
3.00
5
2
2
2.00
 
求解过程
 
SELECT A.PRODID, A.PFORMPRICE, Z.PRICE, (A.PFORMPRICE - Z.PRICE) AS CJ
  FROM PRODUCT A
 INNER JOIN (SELECT X.*
               FROM PRICE X
              INNER JOIN (SELECT B.PRRFNBR, MAX(B.PPRE) AS TEMP
                           FROM PRICE B
                          GROUP BY B.PRRFNBR) AS Y ON X.PRRFNBR = Y.PRRFNBR
              WHERE X.PPRE = Y.TEMP) AS Z ON A.PRODID = Z.PRRFNBR;
 
执行结果
--------------------------------------
1
10.00
2.00
8.00
2
20.00
2.00
18.00
从结果可以看出,求解正确。符合要求。
 
 
另外,在我完成后,博友给出了他自己的写法:
SELECT PRODID,
       PFORMPRICE,
       (SELECT PRICE
          FROM PRICE A
         WHERE A.PRRFNBR = C.PRODID
           AND PPRE =
               (SELECT MAX(PPRE) FROM PRICE B WHERE B.PRRFNBR = A.PRRFNBR)),
       (PFORMPRICE -
       (SELECT PRICE
           FROM PRICE A
          WHERE A.PRRFNBR = C.PRODID
            AND PPRE =
                (SELECT MAX(PPRE) FROM PRICE B WHERE B.PRRFNBR = A.PRRFNBR)))
  FROM PRODUCT C
 
--------------------------------------
1
10.00
2.00
8.00
2
20.00
2.00
18.00
3
30.00
[Null]
[Null]
 
 
 
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/40922,如需转载请自行联系原作者
相关文章
|
SQL Java 数据库连接
springboot-maven项目+jpa 运行过程中执行resources下sql脚本文件-ClassPathResource和ScriptUtils.executeSqlScript的使用
springboot-maven项目+jpa 运行过程中执行resources下sql脚本文件-ClassPathResource和ScriptUtils.executeSqlScript的使用
485 0
springboot-maven项目+jpa 运行过程中执行resources下sql脚本文件-ClassPathResource和ScriptUtils.executeSqlScript的使用
|
SQL 存储 Oracle
数据库小技能:PL/SQL(Procedure Language/SQL,过程化SQL语言)预备知识
过程化SQL语言(Procedural Language/SQL)是Oracle数据库对SQL语句的扩展:在普通SQL语句的使用上增加了编程语言的特点,把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。
228 1
|
SQL 缓存 自然语言处理
软件测试mysql面试题:Mysql中一条sql语句查询过程?
软件测试mysql面试题:Mysql中一条sql语句查询过程?
91 0
|
SQL 缓存 Java
MyBatis源码分析之——执行SQL语句的过程
由于所有的 Mapper 都是 MapperProxy 代理对象,所以任意的方法都是执行MapperProxy 的invoke()方法
159 0
MyBatis源码分析之——执行SQL语句的过程
|
SQL 安全 数据库
SQL注入原理及产生过程
最近在学习关于SQL注入方面的知识,想将一些相关的知识点做个汇总和笔记,方便日后的查阅也方便现在的学习。因为刚开始学习,涉猎还没有很深入,本章将简单的讲讲关于SQL注入的原理及其产生的过程和基本的一些加固方法。
6758 0