获取特定子记录的 SQL 查询

Posted

技术标签:

【中文标题】获取特定子记录的 SQL 查询【英文标题】:SQL Query to get specific child records 【发布时间】:2016-06-01 14:16:57 【问题描述】:

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

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

查询的输入将是分支、类别和子类别 表 A 中的每个记录集由 03 行组成 第 1 行有分支,但类别和子类别为空 第 2 行的 Branch 和 Category Sub-Category 为 Null 第 3 行包含分支、类别和子类别。 Table-A 记录集中的每一行在 Table-B 中都有子记录 仅使用分支记录(第 1 行),具有通用记录,这些记录也可以是第 2 行和第 3 行的子记录 使用 Branch 和 Category Sub-Category 作为 Null 的记录(第 2 行)在表 B 中有子记录,它们覆盖第 1 行的子记录 带有分支、类别和子类别的记录(第 3 行)在表 B 中有子记录,它们覆盖第 1 行和第 2 行的子记录。 第 1,2 和 3 行的所有子记录都将成为输出的一部分,但如果第 3 行中存在子记录,则尽管它存在于其他行中,但输出将包含第 3 行的子记录 如果第 1 行和第 2 行中存在子记录但第 3 行中没有子记录,则输出 将有第 2 行的子记录 如果第 1 行中存在子记录但第 2 行和第 3 行中没有子记录,则 将成为输出的一部分。

现在,

在示例输出中,“Pay”出现在第 1,2 和 3 行,但在 输出我们正在考虑第 3 行的子记录,因为它覆盖了记录 1 和 2 “折扣”存在于记录 1 和 3 中,但输出包括第 3 行的子项 “项目”不是第 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) 问题不清楚。您必须逐行解释预期的输出,在此基础上任何行都是您的输出的一部分。 (2) 尝试共享 create/insert 语句,以便我们可以尝试复制。我们无法键入每一列和每一行来测试场景。 @Utsav,对不起,我无法让我的问题更清楚。我现在更新了它并提到了更详细的描述。希望现在清楚了。 【参考方案1】:
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;

【讨论】:

以上是关于获取特定子记录的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

获取针对特定子项的父记录或针对父项获取子记录的查询是啥?

SQL - 使用 GROUP BY 获取子查询子集中或连接中的最新记录

SQL Server 查询以根据用户提供的 id 获取嵌套的子记录

Oracle SQL:对 CASE WHEN 重复使用子查询,而无需重复子查询

如何设置子查询以获取具有最新日期和最大 ID 的单个记录?

SQL Join与子查询计算不同表中具有相同ID的记录数