-3

これらのすべての左結合を 1 つの左結合だけで回避する方法、または結合が少なくて済むその他の方法を知りたいですか?

select colums
  FROM [SectionAUnresolved] a
  left join sectionanotmarkedcounts sdirector
  on a.director=sdirector.employee

  left join sectionanotmarkedcounts s_rm
  on a.rm=s_rm.employee

  left join sectionanotmarkedcounts s_rep
  on a.rep=s_rep.employee

  left join sectionanotmarkedcounts s_css
  on a.css=s_css.employee

  left join sectionanotmarkedcounts s_Css2
  on a.css2=s_Css2.employee

ご指導ありがとうございました!

4

2 に答える 2

2

質問に直接答えるために、左側の結合テーブルから返すデータがSectionAUnresolvedに含まれるように、スキーマを変更できます。これは、次のいずれかの方法で実行できます。

  1. 適切な列にデータを直接書き込みます。また
  2. 後でバッチで更新する空の列がある

あなたの質問にはあまり背景がありません。したがって、特定の問題に対する絶対的な答えを与えることは困難です。しかし、一般的にこれがあなたの質問に対する答えになります。

結合を恐れる必要はありません。パフォーマンスが問題になる場合は、キーフィールドのインデックス、ビュー(マテリアライズされているかどうかに関係なく)やパーティション、その他のパフォーマンス向上ツールの使用をお勧めします。

アップデート

@Konstantin-Vasilcovのアイデアは、少し間違っていますが(or、not andを必要とする)、良い可能性のように見えました。

 select colums
  FROM [SectionAUnresolved] a
  left join sectionanotmarkedcounts [all]
  on a.director=[all].employee
    or a.rm=[all].employee
    or a.rep=[all].employee
    or a.css=[all].employee
    or a.css2=[all].employee

ただし、これによりレコードが乗算され、後でアプリケーションをピボットできる場合は問題ありませんが、使用された関係に関する情報は提供されません。したがって、SectionAUnresolvedテーブルを正規化するスキーマの変更が必要になります。

 select ct.type, colums
  FROM [SectionAUnresolved] a
  left join SectionAUnresolved_countTypes ct
    on ct.Unresolvedid = a.id
  left join sectionanotmarkedcounts [all]
    on ct.employee=[all].employee

どこ:

  • ct.type {director、rm、rep、css、css2}
  • "ct.Unresolvedid=a.id"-新しいSectionAUnresolved_countTypesテーブルを単一のSectionAUnresolved行にリンクします

結合を2に減らし、結合の数やスキーマの変更を増やすことなく、より多くの「countTypes」を許可します。

アップデート

@ Conrad-Flixのおかげで、caseステートメントを使用して、返された各レコードに使用された結合を判別できます(上記の最初のコードスニペットを参照)。これを行うと、SecionAUnresolvedテーブルをさらに正規化する必要がなくなりますが、パフォーマンスによっては、正規化する必要がある場合があります。

私の知る限り、ケースステートメントは索引付けされておらず、最適化のためにマテリアライズドビューの索引付けが必要になる場合があります。正規化は、IMO、より良い構造改善です。

于 2012-12-26T00:53:21.737 に答える
0

短くて簡単な答えは「いいえ」です。

...必要なデータは異なる行に存在するため、データを取得するには参加する必要があります。それを回避することはできません。

于 2012-12-26T01:02:05.910 に答える