View SQL:?从3NF表创建一个视图,使其看起来像一个单行重复组

View SQL:?从3NF表创建一个视图,使其看起来像一个单行重复组,view,db2,teradata,database-normalization,denormalization,View,Db2,Teradata,Database Normalization,Denormalization,我们有一个遗留表,其中包含重复组 我们希望切换到标准化的父子视图,然后创建一个与旧表完全相同的视图。我们可以逐步升级系统,而不会产生任何影响 我在思考如何高效地编写视图时遇到了一些问题——视图后面有大量数据(100万行)。我们可以在DB2和/或Teradata中实现 旧桌子 PID CID_COUNT -- count of values used CID_1 CVALUE_1 CID_2 CVALUE_2 新的父表 PID CID_COUNT 新的子表 PID CID C

我们有一个遗留表,其中包含重复组

我们希望切换到标准化的父子视图,然后创建一个与旧表完全相同的视图。我们可以逐步升级系统,而不会产生任何影响

我在思考如何高效地编写视图时遇到了一些问题——视图后面有大量数据(100万行)。我们可以在DB2和/或Teradata中实现

旧桌子

 PID 
 CID_COUNT -- count of values used 
 CID_1
 CVALUE_1
 CID_2
 CVALUE_2
新的父表

PID
CID_COUNT
新的子表

PID
CID
CVALUE

假设您使用的是DB211.1.0.0或更高版本,或者DB2Warehouse,那么这段代码将给出您想要的答案

DROP TABLE NEW_PARENT_TABLE;
DROP TABLE NEW_CHILD_TABLE;

CREATE  OR REPLACE VIEW OLD_TABLE (PID, NAME, CID_COUNT, CID_1, CVALUE_1,  CID_2, CVALUE_2)
AS (VALUES 
    (123,'FRED',2,1   ,'Stilton',2  ,'Cheddar')
,   (124,'MARY',1,1   ,'Butter' ,null,null)
,   (125,'BOB', 0,null,null     ,null,null)
)
;
CREATE TABLE NEW_PARENT_TABLE (
      PID INT NOT NULL PRIMARY KEY
    , NAME CHAR(4) NOT NULl UNIQUE
    , CID_COUNT SMALLINT NOT NULL
    ) ORGANIZE BY ROW
;
INSERT INTO NEW_PARENT_TABLE
SELECT DISTINCT PID, NAME, CID_COUNT FROM OLD_TABLE
;
CREATE TABLE NEW_CHILD_TABLE (
      PID INT NOT NULL REFERENCES NEW_PARENT_TABLE
    , CID INT NOT NULL
    , CVALUE VARCHAR(16) NOT NULL
    , PRIMARY KEY ( PID, CID )
    ) ORGANIZE BY ROW
;
INSERT INTO NEW_CHILD_TABLE
SELECT N.*
FROM OLD_TABLE O
,   TABLE(VALUES (O.PID, O.CID_1, O.CVALUE_1)
            ,    (O.PID, O.CID_2, O.CVALUE_2)
            ) AS N (PID, CID, CVALUE )
WHERE
    N.CID IS NOT NULL;

CREATE OR REPLACE VIEW NEW_VIEW AS
SELECT PID, CID_COUNT
,      MAX(CASE WHEN CID = 1 THEN CID    END) AS CID_1
,      MAX(CASE WHEN CID = 1 THEN CVALUE END) AS CVALUE_1
,      MAX(CASE WHEN CID = 2 THEN CID    END) AS CID_2
,      MAX(CASE WHEN CID = 2 THEN CVALUE END) AS CVALUE_2
 FROM NEW_PARENT_TABLE
 LEFT JOIN NEW_CHILD_TABLE USING (PID)
 GROUP BY PID, CID_COUNT
 ;
 SELECT * FROM NEW_VIEW

 PID CID_COUNT CID_1 CVALUE_1 CID_2 CVALUE_2
 --- --------- ----- -------- ----- --------
 123         2     1 Stilton      2 Cheddar
 124         1     1 Butter    NULL NULL
 125         0  NULL NULL      NULL NULL

如果在DB2(对于LUW)10.5上,请在
NEW_视图中使用
on
not
USING
,并限定列。如果在DB2 10.1或更低版本上,还可以删除
按行组织

,这可能有助于您的问题显示一些实际的有形数据,而不仅仅是表设计的框架。添加了颜色,甚至添加了颜色。对我来说,这看起来像Excel/电子表格数据。请以表格的形式发布数据,这就是SQL表示数据的方式。是的,这是一个XL模型。。不,不能粘贴数据或DDL,我会被解雇。让我们假设旧表、新表和新表都是表。和PID名称等是列或字段。这对你有帮助吗?重复值的实际数量是多少?您的Teradata版本是什么?如果您对每个CID值使用联接并避免使用
分组方式,您可能会发现新的\u视图更有效。您最好使用您的真实数据/环境进行测试,以查看哪种情况最有效……谢谢,我们现在就开始测试。谢谢您的帮助。:)