获取特定子记录的 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 获取嵌套的子记录