|
已经把章发给peter了。
我写的是这样:
WITH t AS (
SELECT x,y,z,x+y+z as s, x*y*z as p
,COUNT(*) OVER(PARTITION BY x+y+z) cnt_s ---- 同样的和有多少种组合
,COUNT(*) OVER(PARTITION BY x*y*z) cnt_p ---- 同样的积有多少种组合
FROM (SELECT LEVEL x FROM DUAL CONNECT BY LEVEL<=15)
,(SELECT LEVEL y FROM DUAL CONNECT BY LEVEL<=15)
,(SELECT LEVEL z FROM DUAL CONNECT BY LEVEL<=15)
WHERE x<y AND y<z
)
,r1 AS (
SELECT *
FROM t
WHERE t.cnt_s>1 ------- A找不出来
AND NOT EXISTS (SELECT 1 FROM t t2 WHERE t2.s=t.s AND t2.cnt_p=1)
---- 在构成A的SUM的所有可能中,如果有哪个cnt_p=1则B就可能找出来。
---- 既然A断定B找不出来,那就说明不存在
)
,r2 AS (
SELECT *
FROM (SELECT r1.*
,COUNT(*) OVER(PARTITION BY p) cnt_p2 --------- 在第一轮判断的结果基础上(现在只剩29行),如果同样的积只有一个,B就可以确定
FROM r1
)
WHERE cnt_p2>1 ------- 第二回合B还是不能确定
)
SELECT * FROM
(SELECT r2.*,COUNT(*) OVER(PARTITION BY s) cnt_s2 --------- 在第二轮判断的结果基础上(现在只剩4行),如果同样的和只有一个,A就可以确定
FROM r2
)
WHERE cnt_s2=1;
|
|