0

私は何かについて興味がありました。2 つのテーブルがあるとします。一方には販売コードとプロモーション コードがあり、もう一方にはプロモーション コードと属性のみがあります。プロモーション コードはオンとオフを切り替えることができますが、プロモーション属性は変更される可能性があります。テーブル構造は次のとおりです。

tblSales                    tblPromo
sale  promo_cd  date        promo_cd  attribute   active_dt  inactive_dt
  2     AAA    1/1/2013        AAA      "fun"      1/1/2013    1/1/3001
  3     AAA    6/2/2013        BBB      "boo"      1/1/2013    6/1/2013
  8     BBB     2/2/2013       BBB      "green"    6/2/2013    1/1/3001
  9     BBB     2/3/2013
  10    BBB     8/1/2013

これは私のテーブル/スキーマ/デザインではないことに注意してください。特に属性を測定したい場合に、属性の変更ごとに新しい promo_cd を作成しない理由がわかりません。とにかく、私はこのようなテーブルを作ろうとしています:

sale  promo_cd   attribute
  2     AAA        fun
  3     AAA        fun
  8     BBB        boo
  9     BBB        boo
  10    BBB        green

これまでに行った唯一のことは、内部結合を作成し (これによりレコードが重複します)、販売日をプロモーションのアクティブ/非アクティブな日付と比較してフィルター処理することだけです。しかし、これを行うためのより良い方法はありますか? これは非常に大きなデータ セットであり、効率的に維持したいので、非常に興味がありました。

4

3 に答える 3

1

これは、フィルター条件を JOIN 句に直接入れるのが好きなケースの 1 つです。少なくとも私の脳内では、重複したレコードが結果セットに含まれることはありません。これにより、実際のフィルタリング条件の WHERE 句が残ります。

Select s.sale, s.promo_cd, p.attribute
From tblSales s
  Inner Join tblPromo p 
    on s.promo_cd=p.promo_cd 
    and s.date between p.active_dt and p.inactive_dt
于 2013-07-18T21:44:14.513 に答える
1

JOIN条件に日付を追加するだけです。

SELECT a.sale, a.promo_cd, b.attribute
FROM tblSales a
JOIN tblPromo b
   ON a.promo_cd = b.promo_cd
   AND a.date BETWEEN b.active_dt AND b.inactive_dt

デモ: SQL フィドル

于 2013-07-18T21:49:07.957 に答える
1

私があなたを正しく理解していると仮定すると、次を使用できます。

SELECT s.sale, s.promo_cd, p.attribute
    FROM tblSales s
    JOIN tblPromo p ON p.promo_cd = s.promo_cd AND s.date BETWEENp.active_dt and p.inactive_dt

これは、tblPromo の日付が重複しないことを前提としています (選択したスキーマを考えると、これは可能性が高いと思われます)。

于 2013-07-18T21:45:03.913 に答える