2011-06-29 12 views
2

私は参加する必要がある2つのテーブルがあります。特定の日付範囲に基づいて列を追加する方法

まず表:

EFF_DATE  RATE CURRENCY 
20110101  1.286 USD 
20110201  1.275 USD 
20110301  1.275 USD 
20110401  1.260 USD 
20110501  1.225 USD 

第二表:

を:ACCT_DATEに基づいて

PO_NO TRANS_DATE ACCT_DATE SUPP_NO CURRENCY  LOCAL_AMT 
1000068 20110114 20110115 S016 USD   16,500.00 
1000070 20110214 20110215 S016 USD   7,660.00 
1000072 20110317 20110322 S025 USD   1,080.00 
1000132 20110314 20110315 S037 USD   3,500.00 
1000133 20110414 20110415 S038 USD   14,500.00 

、私は結果は次のようになりますRATE列&を追加したいです

PO_NO TRANS_DATE ACCT_DATE SUPP_NO CURRENCY  LOCAL_AMT RATE 
1000068 20110114 20110115 S016 USD   16,500.00 1.286 
1000070 20110214 20110215 S016 USD   7,660.00 1.275 
1000072 20110317 20110322 S025 USD   1,080.00 1.275 
1000132 20110314 20110315 S037 USD   3,500.00 1.275 
1000133 20110414 20110415 S038 USD   14,500.00 1.26 
1000170 20110531 20110531 S016 USD   15,400.00 1.225 

どのようにSQLを使用してこれを達成できますか?ありがとう!あなたのようなものだろうMySQLでは

答えて

1

:以下

SELECT st.*, ft.rate FROM second_table st LEFT JOIN first_table ft ON (MONTH(acct_date) = MONTH(eff_date) AND YEAR(acct_date) = YEAR(eff_date)) 
+0

これは大きなテーブルでは本当に遅くなります。 –

1

ソリューションはTRANS_DATE、acct_dateとeff_dateがintであることを前提としています。彼らは日付であれば、あなたがフォーマットさフォームでEFF_DATEとACCT_DATEを持って、あなたの特定の例に従ってSQLサーバー

SELECT 
    [trans].[po_no] 
    ,[trans].[trans_date] 
    ,[trans].[acct_date] 
    ,[trans].[supp_no] 
    ,[trans].[currency] 
    ,[trans].[local_amt] 
    ,[month_rate].[rate] 
FROM [trans] 
    JOIN [month_rate] on [eff_date]/100 = [trans].[acct_date]/100 
    AND [month_rate].[currency] = [trans].[currency] 
0
select st.*,ft.rate from second_table st,first_table ft 
where to_char(st.acct_date,'YYYYMM')=to_char(ft.eff_date,'YYYYMM') 
0

に応じて、適切な日付関数を使用する必要があるだけなので、私はあなたが直接の根拠に参加することができると思いますこれら二つのような列

-

select st.*,ft.rate from first_table ft, second_table st 
where st.acct_date=ft.eff_date 

が、これはあなたに言及しているものをご希望の出力は疑問与えることはありません...

あなたは本当にacct_dateに参加しますか?

とあなただけのこのタイプの条件なしに参加したいならば、より良い、その条件に言及し、あなたの質問を更新

0

これはfirstTable.t.EFF_DATEsecondTable.ACCT_DATEのインデックスを使用します(あなたはインデックスを持っている場合!)。

MONTH(),YEAR()などの関数を呼び出すソリューションでは、このようなインデックスを効果的に使用できません。

SELECT st.* 
    , (SELECT ft.RATE 
     FROM firstTable ft 
     WHERE ft.EFF_DATE <= st.ACCT_DATE    
     ORDER BY ft.EFF_DATE DESC 
     LIMIT 1 
     ) AS RATE 
FROM secondTable st 

LIMIT 1は、MySQL構文です。 SQLサーバーの場合はSELECT TOP 1を使用してください。

関連する問題