1

以下のクエリを、より読みやすく変更可能なものにリファクタリングしようとしています。前半は、クエリ元のデータベースを除いて、後半と同じです (ただし、テーブル名は同じです)。

  SELECT
    Column 1 AS c1,
    ...
    Column N AS cN
  FROM
    database1.dbo.Table1

UNION

  SELECT
    'Some String' as c1,
    ...
    NULL as cN
  FROM
    database1.dbo.Table2

UNION

  SELECT
    Column 1 AS c1,
    ...
    Column N AS cN
  FROM
    database2.dbo.Table1

UNION

  SELECT
    'Some String' as c1,
    ...
    NULL as cN
  FROM
    database2.dbo.Table2

このクエリはDRYの定義であり、書き直す必要がありますが、方法がわかりません!

EDIT : linq を使用することはできず、明確な結果が必要です。返される結果ではなく、物理ファイルサイズでクエリを小さくしようとしています。

編集:私が照会しているデータベースは、独自のERPデータベースです。それを再構築することはオプションではありません。

4

8 に答える 8

3

私はここで手足を出して、あなたが私たちに与えた情報に基づいて言います。

それはそれが得られるのと同じくらい良いです

于 2009-01-28T21:22:32.607 に答える
2

これはかなり標準的な SQL パターンです。場合によっては、DRY などの OOP/手続き型コードの原則を無意識に SQL に転用してしまうことがありますが、それらは必ずしも転用可能な概念ではありません。

サブモジュールを探すのではなく、クエリの論理設計全体を簡単に把握できることに注意してください。部分式の 1 つに余分な列がある場合、または列が逆になっている場合、それははみ出します。これは基本的に、実行単位として grok する非常に単純な SQL ステートメントです。

また、デバッグ中は、エディターのテキストの強調表示オプションを使用してステートメントの一部を選択的に実行できると便利です。これは手続き型コードには存在しない手法です。OTOH、ビューなどに散らばっている場合、すべてのピースを追跡しようとすると面倒になる可能性があります.CTEでさえこれを不便にする可能性があります.

于 2009-01-28T23:09:25.680 に答える
2

パフォーマンスに関するヒントの 1 つは、意図的に個別のレコードが必要でない限り、UNION ALL代わりに使用することです。UNIONシンプルUNIONは時間がかかる重複を排除します。UNION ALLそれはしません。

動的 SQL とループで書き直すこともできますが、結果はさらに悪くなると思います。動的SQLアプローチを正当化するのに十分な重複コードがある場合、それは正当化できると思います。

または、ロジックをストアド プロシージャから LINQ のようなものに移動することを検討しましたか? 多くの人にとって、これはオプションではないので、私はただ尋ねています.

最後に、壊れていないものをきれいに見せるために修正したいという衝動を抑えてください。クリーンアップがメンテナンスや検証などに役立つ場合は、それを選択してください。

于 2009-01-28T21:22:29.250 に答える
1

どうしたの?長すぎる?繰り返しが多すぎる?

ときどき醜い SQL が発生することがあります - それに対してできることはあまりありません。

別々のビューを使用してそれらを結合しない限り、それをクリーンアップする方法はありません。

于 2009-01-28T21:23:20.217 に答える
1

私はビューに投票します。これにより、オーバーヘッドはほぼゼロになります (OK、コンパイル時間のコストはわずかですが、それだけのはずです)。次に、プロシージャは次のような形になります

SELECT * FROM database1.view1
UNION
SELECT * FROM database1.view2
UNION
SELECT * FROM database2.view1
UNION
SELECT * FROM database2.view2

これ以上圧縮する必要があるかどうかはわかりませんが、ほとんどのプラットフォームで許容されると思います。

于 2009-01-28T21:32:49.887 に答える
0

動的 SQL テーマについて - ここにサンプルがあります - それがより良いかどうかはわかりません。利点は、SELECT リストを 1 回記述するだけでよいことです。

DECLARE @Select1 varchar(1000)
DECLARE @Select2 varchar(1000)

DECLARE @SQL varchar(4000)


SET @Select1 = 'SELECT
    Column 1 AS c1,
    ...
    Column N AS cN'


SET @Select2 = 'SELECT
    ''Some String'' as c1,
    ...
    NULL as cN'


SET @SQL = @Select1 + ' FROM database1.dbo.Table1 '

SET @SQL = @SQL + ' UNION ' + @Select2 + ' FROM database1.dbo.Table2 '

SET @SQL = @SQL + ' UNION ' + @Select1 + ' FROM database2.dbo.Table1 '

SET @SQL = @SQL + ' UNION ' + @Select2 + ' FROM database2.dbo.Table2 '


EXEC @SQL
于 2009-01-28T21:42:26.747 に答える