0

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

我意识到下面的两个查询正在处理两个不同的表,但这些表包含基本相同类型的数据(不同的谓词保证两个查询),我认为下面的两个投影是“在两个地方定义的相同事物” .

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

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

SELECT columnA
    , columnB
    , columnC
FROM Data

SELECT columnA
    , columnB
    , columnC
FROM DataArchive
4

4 回答 4

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
    )
)

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

于 2009-06-10T16:09:40.363 回答
0

我想不出任何有效的方法。您当然可以使用两个表中的一个创建一个视图,UNION ALL并添加一个将表名作为字符串保存的列,然后这样做,SELECT columnA, columnB, columnC FROM view WHERE table = 'Data'但这感觉就像一个相当丑陋的黑客攻击。

于 2009-06-10T16:07:05.733 回答
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 中可用的宏语言。

于 2009-06-10T16:34:58.690 回答
0

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

于 2010-07-21T04:01:07.317 回答