重构SQL投影?

时间:2009-06-10 16:02:25

标签: sql refactoring refactoring-databases

我不喜欢在两个地方定义相同的东西,如果我可以避免它。

我意识到下面的两个查询正在处理两个不同的表,但是这些表基本上保存了相同类型的数据(不同的谓词保证了两个查询),并且我认为下面的两个预测是“同样的事情在两个地方“。

当/如果我稍后修改这些查询,包括不同的列,我相信我总是希望投影保持相同。

考虑到这一点,并且没有使用动态SQL,并且在任何投影中都没有'*'(我的生产环境中不允许),我可以定义一次“列集”并在两个查询中使用它吗?

SELECT columnA
    , columnB
    , columnC
FROM Data

SELECT columnA
    , columnB
    , columnC
FROM DataArchive

4 个答案:

答案 0 :(得分:1)

让您的基础是Data和DataArchive的联合并使用内联表值函数(SQL Server 2005及更高版本)吗?

CREATE FUNCTION UnifiedData (@LiveOnly bit, @ArchiveOnly bit)
RETURNS TABLE
AS
RETURN (
    SELECT columnA
           ,columnB
           ,columnC
    FROM (
        SELECT 'Live' AS Src, * 
        FROM Data
        WHERE @ArchiveOnly = 0

        UNION ALL

        SELECT 'Archive' AS Src, *
        FROM DataArchive
        WHERE @LiveOnly = 0
    )
)

不是很好,但优化器应该很好地处理它,因为它是内联的。

答案 1 :(得分:0)

我想不出有效的方法。您当然可以使用两个表中的UNION ALL创建一个视图,并添加一个将表名保存为字符串的列,然后执行SELECT columnA, columnB, columnC FROM view WHERE table = 'Data'但这感觉就像是一个相当难看的黑客。< / p>

答案 2 :(得分:0)

是的,SQL这种方式很糟糕。没有全面的满意方式来做到这一点。以下是使用同义词的示例:

if object_id('DataSynonym') is not null drop synonym DataSynonym
create synonym DataSynonym for Data
select columnA, columnB, columnC from DataSynonym

if object_id('DataSynonym') is not null drop synonym DataSynonym
create synonym DataSynonym for DataArchive
select columnA, columnB, columnC from DataSynonym

以这种方式使用同义词的问题在于它们是全局的。如果您在一个连接中动态重新定义同义词,则会影响所有其他连接上的用户。

临时视图/函数或视图/函数变量可以解决问题。或者像SAS中可用的宏语言。

答案 3 :(得分:0)

在Data UNION ALL DataArchive上创建一个视图。如果您以后能够重构和组合2个表,这将对您现有的查询透明。