0

避けられれば、同じことを2か所で定義するのは好きではありません。

以下の2つのクエリは、2つの異なるテーブルを処理していることを認識していますが、これらのテーブルは基本的に同じ種類のデータを保持しており(異なる述語は、2つのクエリを保証します)、以下の2つの予測は「2つの場所で定義された同じもの」と考えています。 。

後でこれらのクエリを変更して別の列を含める場合は、常に予測を同じままにしておく必要があります。

それを前提として、動的SQLを使用せず、プロジェクションに「*」を使用しない場合(実稼働環境では許可されていません)、「列セット」を1回定義して、両方のクエリで使用できますか?

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

Data UNIONALLDataArchiveでビューを作成します。後で2つのテーブルをリファクタリングして結合できる場合、これは既存のクエリに対して透過的になります。

于 2010-07-21T04:01:07.317 に答える
0

効率の良い方法が思い浮かびません。UNION ALLもちろん、テーブル名を文字列として保持する列を追加して、2 つのテーブルのビューを作成することもできますが、それは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

このようにシノニムを使用する際の問題は、その範囲がグローバルであることです。1 つの接続でオンザフライでシノニムを再定義すると、他のすべての接続のユーザーに影響します。

一時的なビュー/関数またはビュー/関数変数は、問題を解決するのに大いに役立ちます。または、SAS で利用できるようなマクロ言語。

于 2009-06-10T16:34:58.690 に答える