查找2列之间的一对一/一对多关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找2列之间的一对一/一对多关系相关的知识,希望对你有一定的参考价值。
我正在生成零件编号列表及其相关的系列。一些零件号属于多个系列,其中大多数只是与一个系列相关联。
要使用整数,有600个不同的部分,其中有750个不同的部分/家庭关系。所以我想做的是创建一个不仅仅属于一个家族的零件编号列表。
作为示例,我在要查看的下方创建了一个数据子集,然后还提供了预期的收益。
part_no family
43d565rfd ar94
43d000rfd ur22
43d000rfd e498
43d565r12 ur24
43d565rfd ur24
43d365r56 ev69
43d365r56 as56
所以基本上不在上面的列表中,我只想返回:
part_no
43d000rfd
43d365r56
因为它们是多个家庭的一部分。
答案
您可以使用聚合和having
:
select part_no
from t
group by part_no
having min(family) <> max(family);
另一答案
使用HAVING
子句过滤掉属于单个族的零件。例如:
select part_no
from (select distinct part_no, family from t) x
group by part_no
having count(*) > 1
或:
select part_no
from t
group by part_no
having count(distinct family) > 1
另一答案
如果您希望零件号以及与其链接的系列和总数,则可以使用以下分析功能:
SQL> WITH YOUR_TABLE(part_no, family) AS
2 (SELECT '43d565rfd', 'ar94' FROM DUAL UNION ALL
3 SELECT '43d000rfd', 'ur22' FROM DUAL UNION ALL
4 SELECT '43d000rfd', 'e498' FROM DUAL UNION ALL
5 SELECT '43d565r12', 'ur24' FROM DUAL UNION ALL
6 SELECT '43d565rfd', 'ur24' FROM DUAL UNION ALL
7 SELECT '43d365r56', 'ev69' FROM DUAL UNION ALL
8 SELECT '43d365r56', 'as56' FROM DUAL)
9 SELECT
10 PART_NO,
11 FAMILY,
12 CNT AS TOTAL_FAMILIES
13 FROM
14 (
15 SELECT
16 PART_NO,
17 FAMILY,
18 COUNT(1) OVER(
19 PARTITION BY PART_NO
20 ) AS CNT
21 FROM YOUR_TABLE
22 ) WHERE CNT > 1
23 ORDER BY PART_NO;
PART_NO FAMI TOTAL_FAMILIES
--------- ---- --------------
43d000rfd ur22 2
43d000rfd e498 2
43d365r56 ev69 2
43d365r56 as56 2
43d565rfd ar94 2
43d565rfd ur24 2
6 rows selected.
SQL>
或如果您希望家庭以逗号分隔,请使用以下命令:
SQL>
SQL> WITH YOUR_TABLE(part_no, family) AS
2 (SELECT '43d565rfd', 'ar94' FROM DUAL UNION ALL
3 SELECT '43d000rfd', 'ur22' FROM DUAL UNION ALL
4 SELECT '43d000rfd', 'e498' FROM DUAL UNION ALL
5 SELECT '43d565r12', 'ur24' FROM DUAL UNION ALL
6 SELECT '43d565rfd', 'ur24' FROM DUAL UNION ALL
7 SELECT '43d365r56', 'ev69' FROM DUAL UNION ALL
8 SELECT '43d365r56', 'as56' FROM DUAL)
9 SELECT
10 PART_NO,
11 LISTAGG(FAMILY, ',') WITHIN GROUP(
12 ORDER BY
13 1
14 ) AS FAMILIES,
15 COUNT(1) AS TOTAL_FAMILIES
16 FROM
17 YOUR_TABLE
18 GROUP BY
19 PART_NO
20 HAVING
21 COUNT(DISTINCT FAMILY) > 1
22 ORDER BY
23 PART_NO
24 ;
PART_NO FAMILIES TOTAL_FAMILIES
--------- -------------------- --------------
43d000rfd e498,ur22 2
43d365r56 as56,ev69 2
43d565rfd ar94,ur24 2
SQL>
干杯!
以上是关于查找2列之间的一对一/一对多关系的主要内容,如果未能解决你的问题,请参考以下文章