【问题标题】:Finding one-to-one / one-to-many relationships between 2 columns查找 2 列之间的一对一/一对多关系
【发布时间】:2019-11-05 21:02:18
【问题描述】:

我正在生成一个零件编号列表及其相关的系列。一些零件编号属于多个系列,其中大多数只与一个系列相关联。

要使用整数,有 600 个不同的部分,其中有 750 个不同的部分/家庭关系。所以我要做的是创建一个不属于一个系列的零件编号列表。

例如,我在下面创建了我正在查看的数据子集,然后还创建了预期回报。

part_no       family
43d565rfd     ar94
43d000rfd     ur22
43d000rfd     e498
43d565r12     ur24
43d565rfd     ur24
43d365r56     ev69
43d365r56     as56

所以基本上不在上面的列表中,我只想返回:

part_no
43d000rfd
43d365r56

因为他们属于多个家庭。

【问题讨论】:

    标签: sql oracle relationship


    【解决方案1】:

    你可以使用聚合和having:

    select part_no
    from t
    group by part_no
    having min(family) <> max(family);
    

    【讨论】:

    • 谢谢...这很好用。 having 正是我所缺少的
    【解决方案2】:

    使用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
    

    【讨论】:

    • 对此进行了测试,看看它是否产生了与上述相同的结果,并且它也有效。谢谢!
    【解决方案3】:

    如果您想要零件编号以及与其关联的家庭和总数,那么您可以使用如下分析函数:

    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>
    

    干杯!!

    【讨论】:

    • 我列表中的下一个是想办法列出与具有多个系列的零件相关的所有系列,因此我肯定会测试您建议的底部。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多