我对一些难以破解的表有一些复杂的要求。
有两张桌子。表A和表B
TableA 的结构类似于:
-------------------------------------
ID COL1 COL2 CAT
-------------------------------------
1 RecAA RecAB 3
2 RecBA RecBB 3
3 RecCA RecCB 2
4 RecDA RecDB 2
5 RecEA RecEB 1
-------------------------------------
TableB 的结构类似于:
-----------------
COL3 TYPE
-----------------
RecAA 10
RecAA 11
RecAA 12
RecAB 10
RecAB 11
RecAB 12
RecAB 13
RecAB 14
RecBA 10
RecBA 11
RecBA 14
RecBA 15
RecBB 10
-----------------
要求:
即根据上述要求,
因此结果应该是:
-------------------------------------
ID COL1 COL2 CAT
-------------------------------------
1 RecAA RecAB 3
-------------------------------------
我的尝试:
WITH TEMP AS (SELECT COL3 FROM TableB GROUP BY COL3 HAVING SUM(CASE WHEN TYPE IN ('10','11','12') THEN 1 ELSE 0 END) = 0)
SELECT S.ID, S.COL1, S.COL2, S.CAT FROM TableA S
INNER JOIN TEMP T ON S.COL1 = T.COL3
WHERE S.CAT = 3;
有人可以帮助实现这一目标吗?
答案 0 :(得分:2)
我认为您快到了,只是您在 CTE 中的行选择似乎有问题,我认为您需要一个 OR:
WITH TEMP AS (
SELECT COL3
FROM TableB
GROUP BY COL3
HAVING SUM(POWER(2, TYPE - 10)) = 7 AND COUNT(*) = 3
)
SELECT
S.ID, S.COL1, S.COL2, S.CAT
FROM
TableA S
INNER JOIN TEMP T ON S.COL1 = T.COL3 OR S.COL2 = T.COL3
WHERE
S.CAT = 3;
我从你的每种类型中减去 10 将你的 10、11、12 变成 0、1、2,然后使用 POWER 将它们变成 1、2 和 4,它们唯一地和为 7 -(换句话说您的 10,11,12 变成了 2^(10-10)
、2^(11-10)
和 2^(12-10)
,它们分别是 1、2 和 4。然后它们的总和必须为 7。
我还要求计数为 3;使用三个 2 的幂的数字达到 7 的唯一方法是使用 1+2+4 来保证最初出现 10、11、12。如果有任何遗漏、多余或重复,则不会是 3 个数字之和为 7
我认为 RecAB 被排除在外,因为即使它有 10,11,12 它也有 13,14 这导致它被排除..
您似乎还说 COL3 应该出现在表 A 的 COL1 或 COL2 中
答案 1 :(得分:1)
您可以使用 listagg 分析版本将 TYPE 列转换为 type_in_list 列,如下所示:
With temp_TableB (COL3, type_in_list) as (
SELECT distinct COL3, listagg(TYPE, ',') within group (order by TYPE)over(partition by COL3)
FROM TableB
)
select tA.*
--, tb.*
from tableA tA
INNER JOIN temp_TableB tB on (tA.COL1 = tB.COL3 or tA.COL2 = tB.COL3)
Where tA.CAT = 3
AND tB.TYPE_IN_LIST = '10,11,12'
;