Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 检查1:N层次结构保持在4个级别_Sql_Plsql_Hana - Fatal编程技术网

Sql 检查1:N层次结构保持在4个级别

Sql 检查1:N层次结构保持在4个级别,sql,plsql,hana,Sql,Plsql,Hana,我在一个表中有5个级别的层次结构级别数据 1.BRANCH 2.LEGAL-ENTITY 3.REPORT-UNIT 4.REGIONAL 5.COUNTRY 我有一个表,其中包含包含所有以分支作为主键的层次结构的记录。 我需要检查高级别层次结构与低级别层次结构之间是否保持1:n的关系 WHITEFIELD|BANGALORE|KARNATAKA|INDIA|APAC WHITEFIELD|BANGALORE|MYSORE|INDIA|APAC - WRONG RECORD MG ROAD|B

我在一个表中有5个级别的层次结构级别数据

1.BRANCH
2.LEGAL-ENTITY
3.REPORT-UNIT
4.REGIONAL
5.COUNTRY
我有一个表,其中包含包含所有以分支作为主键的层次结构的记录。 我需要检查高级别层次结构与低级别层次结构之间是否保持1:n的关系

WHITEFIELD|BANGALORE|KARNATAKA|INDIA|APAC
WHITEFIELD|BANGALORE|MYSORE|INDIA|APAC - WRONG RECORD
MG ROAD|BANGALORE|KARNATAKA|INDIA|APAC
MG ROAD|NEW DELHI|DELHI|INDIA|APAC - WRONG RECORD
SILK BOARD|BANGALORE|KARNATAKA|INDIA|APAC
SILK BOARD|PUNE|MAHARASTRA|INDIA|APAC - WRONG RECORD
为了实现这一点,我想写一个查询,它可以给我不满足上述规则的记录

我已经写了一个查询,可以给出第4级和第5级的结果

SELECT COD_BRNC,COUNT(DISTINCT COD_LEGL_ENTT) FROM TDI_GEO_BY_ORIGIN
WHERE COD_BRNC  NOT LIKE '%_D' AND YEAR(DAT_END_GEO_ORGN ) = 9999
GROUP BY COD_BRNC HAVING COUNT(DISTINCT COD_LEGL_ENTT) >  1
它给了我

SILK BOARD|2
MG ROAD|2

您的第一个查询是一个良好的开端。 由于您没有给出完整的表描述,我创建了自己的测试用例:

DROP TABLE level_5_test;

CREATE TABLE level_5_test( branch_id    VARCHAR2( 3 )
                     , level_1      VARCHAR2( 3 )
                     , level_2      VARCHAR2( 3 )
                     , level_3      VARCHAR2( 3 )
                     , level_4      VARCHAR2( 3 )
                     , description  VARCHAR2( 30 )
                      );

INSERT INTO level_5_test
 VALUES ( 'B0', 'L1', 'L2', 'L3', 'L4', 'No Problems' );

INSERT INTO level_5_test
 VALUES ( 'B1', 'L1', 'L2', 'L3', 'L4', 'Level 1 Problems' );

INSERT INTO level_5_test
     VALUES ( 'B1', 'E1', 'L2', 'L3', 'L4', 'Level 1 Problems' );

INSERT INTO level_5_test
     VALUES ( 'B2', 'L1', 'L2', 'L3', 'L4', 'Level 2 Problems' );

INSERT INTO level_5_test
     VALUES ( 'B2', 'L1', 'E2', 'L3', 'L4', 'Level 2 Problems' );

INSERT INTO level_5_test
     VALUES ( 'B3', 'L1', 'L2', 'L3', 'L4', 'Level 3 Problems' );

INSERT INTO level_5_test
     VALUES ( 'B3', 'L1', 'L2', 'E3', 'L4', 'Level 3 Problems' );

INSERT INTO level_5_test
     VALUES ( 'B4', 'L1', 'L2', 'L3', 'L4', 'Level 4 Problems' );

INSERT INTO level_5_test
     VALUES ( 'B4', 'L1', 'L2', 'L3', 'E4', 'Level 4 Problems' );

INSERT INTO level_5_test
     VALUES ( 'B5', 'L1', 'L2', 'L3', 'E4', 'Double Problems' );

INSERT INTO level_5_test
     VALUES ( 'B5', 'L1', 'E2', 'L3', 'L4', 'Double Problems' );

COMMIT;
--
获得所有答案的最佳方法是查询所有字段并添加countdistinct的分析变量。。。其中,您可以按分支id进行分区:

WITH level_query
     AS (SELECT branch_id
              , level_1
              , level_2
              , level_3
              , level_4
              , description
              , COUNT( DISTINCT level_1 ) OVER (PARTITION BY branch_id)
                   AS level_1_count
              , COUNT( DISTINCT level_2 ) OVER (PARTITION BY branch_id)
                   AS level_2_count
              , COUNT( DISTINCT level_3 ) OVER (PARTITION BY branch_id)
                   AS level_3_count
              , COUNT( DISTINCT level_4 ) OVER (PARTITION BY branch_id)
               AS level_4_count
       FROM level_5_test)
SELECT *
  FROM level_query
 WHERE level_1_count > 1
    OR level_2_count > 1
    OR level_3_count > 1
    OR level_4_count > 1;
这对Oracle有效,但对Hana可能还不起作用。然后,您必须将四个查询与UNION ALL组合起来

SELECT   'L1' AS level_name
       , branch_id
    FROM level_5_test
GROUP BY branch_id
  HAVING COUNT( DISTINCT level_1 ) > 1
UNION ALL
SELECT   'L2' AS level_name
       , branch_id
    FROM level_5_test
GROUP BY branch_id
  HAVING COUNT( DISTINCT level_2 ) > 1
UNION ALL
SELECT   'L3' AS level_name
       , branch_id
    FROM level_5_test
GROUP BY branch_id
  HAVING COUNT( DISTINCT level_3 ) > 1
UNION ALL
SELECT   'L4' AS level_name
       , branch_id
    FROM level_5_test
GROUP BY branch_id
  HAVING COUNT( DISTINCT level_4 ) > 1
ORDER BY 2, 1;

第一个解决方案只需要一次完整的表扫描,第二个查询需要四次,并且需要第五次FTS来提供与第一次相同的信息

您使用plsql标记了您的问题,这表示Oracle数据库。但您也用hana标记了它,这是一个完全不同的DBMS。这是哪一个?我想在HANA上运行的代码,但oracle人员也可以使用相同的场景,并且HANA和oracle的SQL语法相同,因此我标记了HANA。不同的dbms永远不会完全相同,即使语法看起来像这样。您应该只使用plsql或hana作为@a_horse_,并且没有名称。如果人们愿意的话,他们可以使用sql作为其他dbms的参考。我们能否专注于找到解决这个问题的逻辑,运行哪个数据库的语法不是重要的问题。。重要的是你将如何解决它,,