查找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列之间的一对一/一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

2个表之间的关系 - 一对多和一对一(可空)EF代码优先

11-表之间关系

在模型值及其关系中查找字符串的一部分的自定义搜索(一对多)

如何在 php Laravel 中的两个表之间创建一对多关系?

一对多和递归关系 - 强制设置值

JPA 2 一对多 - JPA 如何推断列信息?