代码之家  ›  专栏  ›  技术社区  ›  lance

重构SQL投影?

  •  0
  • lance  · 技术社区  · 15 年前

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

    我意识到下面的两个查询处理的是两个不同的表,但这些表基本上包含相同类型的数据(不同的谓词支持这两个查询),我认为下面的两个投影是“在两个地方定义的相同的东西”。

    如果我以后修改这些查询以包含不同的列,我肯定希望投影保持相同。

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

    SELECT columnA
        , columnB
        , columnC
    FROM Data
    
    SELECT columnA
        , columnB
        , columnC
    FROM DataArchive
    
    4 回复  |  直到 14 年前
        1
  •  1
  •   Cade Roux    15 年前

    您的基础是否是数据和数据存档的联合体并使用内联表值函数(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
        )
    )
    

    不是很好,但是由于优化器是内联的,所以它应该被优化器很好地处理。

        2
  •  0
  •   Blixt    15 年前

    我想不出任何有效的方法。你当然可以用 UNION ALL 在两个表中添加一列,将表名作为字符串保存,然后执行 SELECT columnA, columnB, columnC FROM view WHERE table = 'Data' 但这感觉像是一个相当丑陋的黑客。

        3
  •  0
  •   Peter Radocchia    15 年前

    是的,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那样的宏语言。

        4
  •  0
  •   orbfish    14 年前

    在数据联合所有数据存档上创建视图。如果您以后能够重构和组合这两个表,那么这对您现有的查询是透明的。