【问题标题】:How to check 1 to 1 relationship in Oracle(in one table)如何在 Oracle 中检查 1 对 1 关系(在一张表中)
【发布时间】:2019-12-17 18:50:33
【问题描述】:

假设我有一个包含许多列的表,但其中只有两个对我很重要。我想检查 col1 和 col2 之间的 1 对 1 关系(如果 col1 存在更多,则必须显示 col2 的一个记录)。这是我的sql查询:

select tbl1.col1, count(tbl1.col1)
  from admin.table_1 tbl1
  left join ( select col2,col1 from admin.table_1) tbl2
    on tbl1.col1 = tbl2.col1 and tbl1.col2 = tbl2.col2
 group by tbl1.col1
having count(tbl1.col1) >1;

我的计算正确吗?也许可以改进?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您需要检查每个col1 有一个col2 以及每个col2 有一个col1 的反身关系。您可以使用解析 COUNT 函数执行这些检查:

    Oracle 设置

    CREATE TABLE TABLE_1 ( col1, col2 ) AS
    SELECT 1, 1 FROM DUAL UNION ALL
    SELECT 2, 2 FROM DUAL UNION ALL
    SELECT 2, 3 FROM DUAL UNION ALL
    SELECT 4, 4 FROM DUAL UNION ALL
    SELECT 5, 4 FROM DUAL;
    

    查询

    SELECT col1, col2
    FROM   (
      SELECT col1,
             col2,
             COUNT( col1 ) OVER ( PARTITION BY col2 ) AS col1_per_col2,
             COUNT( col2 ) OVER ( PARTITION BY col1 ) AS col2_per_col1
      FROM   table_1
    )
    WHERE  col1_per_col2 > 1
    OR     col2_per_col1 > 1;
    

    输出

    COL1 | COL2 ---: | ---: 2 | 2 2 | 3 4 | 4 5 | 4

    db小提琴here

    【讨论】:

      【解决方案2】:

      您可以直接使用group by,如下:

      SELECT
          TBL1.COL1,
          COUNT(1)
      FROM
          ADMIN.TABLE_1 TBL1
      GROUP BY
          TBL1.COL1
      HAVING
          COUNT(DISTINCT TBL1.COL2) > 1;
      

      干杯!!

      【讨论】:

        【解决方案3】:

        你可以使用exists

        select tbl1.col1, count(tbl1.col1)
          from admin.table_1 tbl1 
         where exists ( select 1 
                          from admin.table_1 tbl2 
                         where tbl2.col1 = tbl1.col2 )
         group by tbl1.col1                  
        having count(tbl1.col1)>1    
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-08
          • 1970-01-01
          • 1970-01-01
          • 2019-12-25
          • 2013-02-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多