一個博友的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] |