根据特定条件检索

时间:2021-02-10 13:54:54

标签: oracle

我对一些难以破解的表有一些复杂的要求。

有两张桌子。表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
-----------------

要求

  1. TableA 中的记录应具有 CAT = 3。
  2. TableA 的 COL1 或 COL2 应该在 TableB 的 COL3 中可用。
  3. COL3 绝对应该在 10、11、12 中有 TYPE,并且应该只有那个 TYPE。

根据上述要求

  1. 在 TableA 中可用的记录中,ID 为 1 和 2 的记录在 TableA 中的 CAT = 3
  2. 这两条记录在 TableB 的 COL3 中至少只有一个值。 (表A中ID为1的记录在表B中同时具有COL1和COL2,表A中ID为2的记录在表B中具有COL1)
  3. RecAA 记录有类型 10、11、12 和只有 10、11、12。所以 RecAB 是否有 10、11、12 并不重要。但是 RecBA 和 RecBB 都没有 10,11,12 类型。

因此结果应该是

-------------------------------------
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;

有人可以帮助实现这一目标吗?

2 个答案:

答案 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'
;
相关问题