2016-09-08 3 views
6

私は、年を持つ別のテーブルに参加するために年(日付)などの結合として機能を使用してどこか読んで知っていることを知っている結合する最良の方法ではありません。最良の方法は、使用日付フィールドに参加する

私は基本的に2016年の値を持つ年のフィールドと、実際の日付が01/01/2016のような別のテーブルを持っています。これは年を使って結合します。

2016年のフィールドを作成することをお勧めします。通常、財務期間に開始して、開始日01/04/2016と終了日31/03/2016のフィールドを持ち、これらのフィールドを使用します参加する。しかし、Joinの面でどのように見えるのだろうかと疑問に思っていましたか?年01/01/2016をyear()関数を使用して1年に変換する方法を使用して続けますか?

alter table t add start_year as (year(start_date)); 

create index idx_t_??_start_year on t(??, start_year); 

??は、1つのまたは複数の他の列であることを意図している:あなたが行うことができます

+2

いくつかのサンプルデータはそれをより良くするでしょう:) – kbball

+1

あなたの質問は明確ではありません。同じ暦年または4月から3月に終了する会計年度に該当するレコードに参加しようとしていますか?後の部分が正しい場合、上記のようなあなたの結合は、前四半期の値を結合するのに役立ちます。あなたの質問を明確にし、使用しているクエリを表示し、サンプルデータを提供してください... – anil

答えて

1

ことの一つは、計算列を定義し、その上でインデックスを作成することです。 start_yearのインデックスはそれほど選択的ではないため、SQL Serverはそれを使用しないことがあります。

3

いいえ、特別なことはしないでください。あなたの問題は、問題を逆転させることで簡単に解決できます。

  • それは遅いです:

    あなたの現在の実装での問題は、関数が2つの厄介な効果を有し、メインテーブルのすべての行のための結合されたテーブルのすべての行で実行されなければならないということです。あなたは、結合テーブル

の日時列にあなたは(1があった場合、そこにする必要があります)インデックスを使用することはできません

  • 関数n×mの時間を実行する必要があります。しかし、すべてを回避するための簡単な方法がありますthat nastiness:年の開始時刻と終了時刻を年の値からdatetimesとして計算し、それを使ってdatetimeがこれらの2つの値の間にある他のテーブルに結合します。これは、希望:

    • 一度だけ、メインテーブルの行ごとの開始/終了日を計算
    • は、インデックスがdatetime型の列(すでに1が存在しない場合は、1を追加する必要があります)
    上で使用できるようにします

    私は本当にここで疑似クエリは次のようになります、あなたは本当のコードを使用するのに十分な質問を理解していません:

    select * 
    from table1 
    join table2 on table2.datetime 
        between <calculate start of year from table1.year> 
        and <calculate end of year from table1.year> 
    
  • +0

    これは私が望んでいたものです、ありがとう、それをテストします – abs786123

    -1

    こんにちは
    ではなく、広告のリスクを取ります新しい列を挿入するには、部分文字列関数を使用します。 2つのテーブルから必要な列を取得します。ジョイン条件で、日付形式がdd/mm/yyyyの場合、column_Table1 = substring(column_Table2,6,10)として条件を指定してください。

    +0

    これはパフォーマンスには良いでしょうか? – abs786123

    関連する問題