-1

我有一个规范化表(表 a)和一个非规范化表(表 b),如下所示:

在此处输入图像描述

基本上,对于表 a 中相同学生 ID 的每一行,我想读取所有具有相同 studentId 的父母并将数据放入表 B 中的一行。

因此,如果我在表 A 中有 3 行,那么表 B 中将有一行,其中填写了 4 个父字段中的 3 个。对此 SQl 查询的任何帮助将不胜感激。

表 A 中的数据样本

parentID studentID parentName
1         1         test
2         1          test1

我想要的结果在表 B

studentID parent1 parent2
1         test    test1
4

2 回答 2

2

这是一个可以生成您正在寻找的平面结果的查询。您是否有理由不能只将其作为视图而不是永久地重构您的数据?

with RankedNormalizedFamily as (
  select
    ROW_NUMBER() over (PARTITION by studentid ORDER BY parentid) as rank
    ,parentID
    ,studentID
    ,parentName
  from
    NormalizedFamily
)
select
  studentID
  ,max(case when rank = 1 then parentName end) as parentName1
  ,max(case when rank = 2 then parentName end) as parentName2
  ,max(case when rank = 3 then parentName end) as parentName3
  ,max(case when rank = 4 then parentName end) as parentName4
from
  RankedNormalizedFamily f
group by
  studentID

演示:http ://www.sqlfiddle.com/#!3/91843/9

要将这些数据推送到FlatFamily您将使用INSERT...SELECT

insert into FlatFamily
select
  studentID
  ...
于 2012-07-25T16:57:47.000 回答
1

因此,在不知道您使用的数据库版本的情况下,我将只为您提供基础知识和可能在您的系统中工作的示例查询。

基本上,您正在考虑创建一个“透视查询”,但为了对您的查询执行此操作,您需要使用分析函数来指定从表 A 返回的每一行的行号:

select studentID,
       parentID
        row_number() over (partition by studentID order by studentID) as parentNum
FROM NormalizedFamily
order by studentID 

然后使用您想要将数据透视查询放在一起的结果:

select studentID, 
MAX(case when parentNum = 1 then parentID else null),
MAX(case when parentNum = 2 then parentID else null)
MAX(case when parentNum = 3 then parentID else null)
MAX(case when parentNum = 4 then parentID else null)
from (select studentID,
           parentID
            row_number() over (partition by studentID order by studentID) as parentNum
    FROM NormalizedFamily
    order by studentID)

您可能必须清理语法以使用数据库,但这是它的一般要点。

于 2012-07-25T17:00:44.490 回答