Рефакторированная проекция SQL? - PullRequest
0 голосов
/ 10 июня 2009

Мне не нравится, когда одна и та же вещь определяется в двух местах, если я могу избежать этого.

Я понимаю, что два приведенных ниже запроса имеют дело с двумя разными таблицами, но эти таблицы содержат в основном данные одного типа (разные предикаты требуют двух запросов), и я думаю о двух проекциях ниже, как о "одном и том же, определенном в два места ".

Когда / если я изменю эти запросы позже, чтобы включить другие столбцы, я уверен, что я всегда буду хотеть, чтобы прогнозы оставались идентичными.

Учитывая, что, без использования динамического SQL и без '*' в любой проекции (не разрешено в моей производственной среде), могу ли я определить «набор столбцов» один раз и использовать его в обоих запросах?

SELECT columnA
    , columnB
    , columnC
FROM Data

SELECT columnA
    , columnB
    , columnC
FROM DataArchive

Ответы [ 4 ]

1 голос
/ 10 июня 2009

Ваша база должна быть объединением 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
    )
)

Не очень хорошо, но оптимизатор должен обрабатывать его очень хорошо, поскольку он встроен.

0 голосов
/ 21 июля 2010

Создание представления в Data UNION ALL DataArchive. Если позже вы сможете выполнить рефакторинг и объединить 2 таблицы, это будет прозрачно для ваших существующих запросов.

0 голосов
/ 10 июня 2009

Да, 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.

0 голосов
/ 10 июня 2009

Я не могу придумать какого-либо эффективного способа сделать это. Конечно, вы можете создать представление с UNION ALL из двух таблиц с добавлением столбца, который содержит имя таблицы в виде строки, а затем выполнить SELECT columnA, columnB, columnC FROM view WHERE table = 'Data', но это выглядит как довольно уродливый хак.

...