Pergunta

Eu não gosto de ter a mesma coisa definida em dois lugares, se eu puder evitá-lo.

Eu percebo as duas consultas abaixo está lidando com duas tabelas diferentes, mas essas tabelas contêm basicamente o mesmo tipo de dados (predicados distintos justificar as duas consultas), e eu acho que as duas projeções abaixo como "a mesma coisa definida na dois lugares".

Quando / se eu modificar essas consultas mais tarde, para incluir colunas diferentes, eu tenho certeza que vou sempre querem as projeções para permanecer idêntica.

Tendo em conta que, e sem o uso de SQL dinâmico, e sem '*' em qualquer projeção (não é permitido no meu ambiente de produção), eu posso definir o "ColumnSet" uma vez e usá-lo em ambas as consultas?

SELECT columnA
    , columnB
    , columnC
FROM Data

SELECT columnA
    , columnB
    , columnC
FROM DataArchive
Foi útil?

Solução

Tenha sua base de ser uma união de Dados e DataArchive e usar uma função inline mesa de valor (SQL Server 2005 e acima)?

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

Não é ótimo, mas deve ser tratado muito bem pelo otimizador, já que é embutido.

Outras dicas

Eu não posso pensar de qualquer maneira eficiente de fazê-lo. Você poderia, claro, fazer uma exibição com um UNION ALL das duas tabelas com a adição de uma coluna que contém o nome da tabela como uma corda, em seguida, fazer SELECT columnA, columnB, columnC FROM view WHERE table = 'Data' mas que se sente como um hack feio.

Sim, SQL é horrível assim. Não há all-around forma satisfatória para fazê-lo. Aqui está um exemplo usando sinônimos:

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

O problema com o uso sinônimos desta forma é que eles são de âmbito mundial. Se você redefinir um sinônimo na mosca em uma conexão, ele irá afetar os usuários em todas as outras ligações.

vistas temporárias / funções ou variáveis ??vista / função que percorrer um longo caminho para corrigir o problema. Ou uma linguagem macro como o que está disponível no SAS.

Criar uma vista da União Todos os dados DataArchive. Se você é depois capaz de refatorar e combinar as 2 mesas, este será transparente para suas consultas existentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top