我需要将数据从有多个列的非规范化数据库导出到新的规范化数据库。
一个例子是Products表,它有 30 个布尔列(ValidSize1,ValidSize2 ecc...),每条记录都有一个外键,指向一个Sizes表,其中有 30 列带有尺寸代码(XS,S,M 等...)。为了获取产品的有效尺寸,我必须扫描两个表并仅在产品上的 ValidSizeX 为真时从 Sizes 表中获取值 SizeCodeX。像这样的东西:
Products Table
--------------
ProductCode <PK>
Description
SizesTableCode <FK>
ValidSize1
ValidSize2
[...]
ValidSize30
Sizes Table
-----------
SizesTableCode <PK>
SizeCode1
SizeCode2
[...]
SizeCode30
现在我正在使用重复 30 次的“模板”查询:
SELECT
Products.Code,
Sizes.SizesTableCode, -- I need this code because different codes can have same size codes
Sizes.Size_1
FROM Products
INNER JOIN Sizes
ON Sizes.SizesTableCode = Products.SizesTableCode
WHERE Sizes.Size_1 IS NOT NULL
AND Products.ValidSize_1 = 1
我只是将此查询放在一个循环中,并将“_1”替换为循环索引:
SET @counter = 1;
SET @max = 30;
SET @sql = '';
WHILE (@counter <= @max)
BEGIN
SET @sql = @sql + ('[...]'); -- Here goes my query with dynamic indexes
IF @counter < @max
SET @sql = @sql + ' UNION ';
SET @counter = @counter + 1;
END
INSERT INTO DestDb.ProductsSizes EXEC(@sql); -- Insert statement
GO
有没有更好、更清洁或更快的方法来做到这一点?我正在使用SQL Server,我只能使用SQL/TSQL。