用于获取特定子记录的SQL查询

时间:2016-06-01 14:16:57

标签: sql oracle

我需要根据父表搜索条件获取子表记录,但它们需要是不同的,输出应如下所示: enter image description here

表A,有三行。第一行用于通用规则,第二行用于特定类别,第三行用于特定分支,类别和子类别。 现在,我的输出应该包含特定于泛型的规则。 以下是输出规则:

  • 查询的输入将为分支,类别和子类别
  • 表-A中的每个记录集由03行组成 第1行具有分支但类别和子类别为空 第2行具有分支和类别子类别为空 第3行包含分支,类别和子类别。
  • 表-A记录集中的每一行都有表-B
  • 中的子记录
  • 仅使用分支记录(第1行),具有通用记录,这些记录也可以是第2行和第3行的子记录
  • 使用分支和类别子类别记录为空(第2行)在表B中具有子记录并且它们覆盖第1行的子记录
  • 带分支,类别和子类别的记录(第3行)在表B中有子记录,它们覆盖第1行和第2行的子记录。
  • 第1,2行和第2行的所有子记录3将是输出的一部分但是如果第3行中存在子项,那么即使它存在于其他行中,输出也将包含第3行的子记录
  • 如果第1行和第1行中有儿童记录。 2然后不输出3 将有第2行的子记录
  • 如果第1行中存在子记录但第2行和第2行中没有。 3然后呢 将成为产出的一部分。

现在,

  • 在示例输出中,'Pay'出现在第1,2和3行但是在 输出我们正在考虑第3行的子记录,因为它覆盖了记录1和记录1。 2
  • '折扣'出现在记录1& 3但输出包括第3行的孩子
  • 'Items'不是第1行和第2行子项的一部分,但因为它存在于第3行中,所以它将成为输出的一部分
  • 'Paris'只是第2行的一部分,但因为它没有被第2行覆盖 它是输出的一部分,因为它是

我尝试过以下查询,但没有提供所需的输出:

SELECT DISTINCT RULE,
                value
FROM   siebel.b rxm
WHERE  par_row_id IN (SELECT row_id
                      FROM   siebel.a
                      WHERE  ( branch = 'Civil'
                               AND category = 'C.M.> (Civil)'
                               AND sub_category IS NULL )
                              OR ( branch = 'Civil'
                                   AND category = 'C.M. (Civil)'
                                   AND sub_category = 'Pauper' )
                              OR ( branch = 'Civil'
                                   AND category IS NULL
                                   AND sub_category IS NULL ))

我使用Oracle作为RDBMS。

架构声明:

Create Table A (ROW_ID int, BRANCH varchar(50), CATEGORY varchar(50), SUB_CATEGORY varchar(50))
Create Table B (PAR_ROW_ID int, RULE varchar(50), Value varchar(50))

INSERT INTO A (ROW_ID, BRANCH)
VALUES (1,'Civil')
INSERT INTO A (ROW_ID, BRANCH, CATEGORY)
VALUES (2,'Civil','C.M. (Civil)')
INSERT INTO A (ROW_ID, BRANCH, CATEGORY, SUB_CATEGORY)
VALUES (3,'Civil','C.M. (Civil)','Pauper')

INSERT INTO B (PAR_ROW_ID, RULE, VALUE)
VALUES (1,'Pay','10')
INSERT INTO B (PAR_ROW_ID, RULE, VALUE)
VALUES (1','Days','25')
INSERT INTO B (PAR_ROW_ID, RULE, VALUE)
VALUES (1,'Discount','20')
INSERT INTO B (PAR_ROW_ID, RULE, VALUE)
VALUES (2,'Pairs','5')
INSERT INTO B (PAR_ROW_ID, RULE, VALUE)
VALUES (2,'Pay','30')
INSERT INTO B (PAR_ROW_ID, RULE, VALUE)
VALUES (3,'Pay','15')
INSERT INTO B (PAR_ROW_ID, RULE, VALUE)
VALUES (3,'Discount','20')
INSERT INTO B (PAR_ROW_ID, RULE, VALUE)
VALUES (3,'items','30')

1 个答案:

答案 0 :(得分:0)

SELECT MAX( par_row_id ) AS par_row_id,
       rule,
       MAX( value ) KEEP ( DENSE_RANK LAST OVER ORDER BY par_row_id ) AS value
FROM   table_b
GROUP BY rule

或者:

SELECT par_row_id,
       rule,
       value
FROM   (
  SELECT b.*,
         ROW_NUMBER() OVER ( PARTITION BY rule ORDER BY par_row_id DESC ) AS rn
  FROM   table_b b
)
WHERE  rn = 1;