sql—在c中将一对多关系中结构化的记录转换为对象列表#

r8xiu3jd  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(293)

我的table结构如下:

PrimaryKey |ColumnDesc   |ColumnValue
------------------------------------
Object1    |Name - First |Steve
Object1    |Height - in  |60
Object1    |Weight - lbs |180.3
Object2    |Name - First |Edward
Object2    |Height - in  |62
Object2    |Weight - lbs |200.0

从数据库中提取数据时,我希望将其从上面的结构转换为对象列表,并使用以下类结构:

public class Person
{
     public string Name { get; set; }
     public int Height { get; set; }
     public double Weight { get; set; }
}

这样就可以将其保存到另一个表(称为person),其结构如下:

PersonId |Name   |Height  |Weight
---------------------------------
10000    |Steve  |60      |180.3
10001    |Edward |62      |200.0

我很难想出最好的办法来做这件事。我设想这样设置一个Map表:

OriginalColumName |NewColumnName|DataType
-----------------------------------------
Name - First      |Name         |string
Height - in       |Height       |int
Weight - lbs      |Weight       |double

方法将根据“primarykey”字段对第一个表结构中的记录进行分组,然后使用Map表和反射将值和类型分配给每个对象。我正在努力想出正确的语法来实现这一点(特别是关于不同的类型),我想知道是否有一种更简洁和逻辑的方式来实现代码中的这一要求。是否已有更好的解决方案,或者是否有人对实现这一目标的最佳途径提出了建议?

r7knjye2

r7knjye21#

如果第一个表名为table1,那么这将在sql中起作用——您可以在insert语句中使用它来生成person表。

SELECT BASE.primarykey, first.columnvalue as name, height.columnvalue as height, weight.columnvalue as weight
 FROM (
   SELECT DISNTCT PrimaryKey 
   FROM table1
 ) as BASE
 LEFT JOIN table1 as first on base.primarykey = first.primarykey and first.columndesc = 'Name - First' 
 LEFT JOIN table1 as height on base.primarykey = height.primarykey and height.columndesc = 'Height - in' 
 LEFT JOIN table1 as weight on base.primarykey = weight.primarykey and weight.columndesc = 'Weight - lbs'
6pp0gazn

6pp0gazn2#

根据您的数据库和连接数据库的方法,我相信这是数据透视表的好地方:
假设数据透视表测试如下所示:

CREATE TABLE PivotTest (
    PrimaryKey int not null,
    ColumnDesc varchar(30),
    ColumnValue varchar(100)
)

INSERT INTO PivotTest (PrimaryKey, ColumnDesc, ColumnValue)
  VALUES
  -- PrimaryKey,   ColumnDesc, ColumnValue 
    (     10000, 'Name-First',      'Steve'),
    (     10000,  'Height-In',         '60'),
    (     10000, 'Weight-Lbs',      '180.3'),
    (     10001, 'Name-First',     'Edward'),
    (     10001,  'Height-In',         '62'),
    (     10001, 'Weight-Lbs',      '200.0')

在sql server中使用透视表时,语法如下所示:

SELECT * 
  FROM
    (SELECT 
        Id,
        Data,
        Description
    FROM PivotTest) AS Pvt
PIVOT (
    MIN(Data)
    FOR Description IN ([Name - First], [Height - in], [Weight - lbs])
) AS Result

以下是一些有用的链接,可以进一步解释pivot和unpivot:
微软,
Oracle,
编码光

相关问题