View SQL:?从3NF表创建一个视图,使其看起来像一个单行重复组
我们有一个遗留表,其中包含重复组 我们希望切换到标准化的父子视图,然后创建一个与旧表完全相同的视图。我们可以逐步升级系统,而不会产生任何影响 我在思考如何高效地编写视图时遇到了一些问题——视图后面有大量数据(100万行)。我们可以在DB2和/或Teradata中实现 旧桌子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
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
notUSING
,并限定列。如果在DB2 10.1或更低版本上,还可以删除按行组织,这可能有助于您的问题显示一些实际的有形数据,而不仅仅是表设计的框架。添加了颜色,甚至添加了颜色。对我来说,这看起来像Excel/电子表格数据。请以表格的形式发布数据,这就是SQL表示数据的方式。是的,这是一个XL模型。。不,不能粘贴数据或DDL,我会被解雇。让我们假设旧表、新表和新表都是表。和PID名称等是列或字段。这对你有帮助吗?重复值的实际数量是多少?您的Teradata版本是什么?如果您对每个CID值使用联接并避免使用分组方式,您可能会发现新的\u视图更有效。您最好使用您的真实数据/环境进行测试,以查看哪种情况最有效……谢谢,我们现在就开始测试。谢谢您的帮助。:)