2017-07-05 4 views
2

Oracle SQLの使用にはかなり精通していますが、予約プロジェクトではMS SQLデータベースから同じデータ抽出が必要です。そして私はどこから始めるべきかわからない - 下手なのは下の方をSQL構文に変換するのを手伝ってくれるのだろうか?その大きな文と、報酬としてグーグル各1を通じてなく、ビールの無い喜び...Oracle SQL文をMS SQL文に変換する

仮想場合に動作することを試みた...

SELECT * 
FROM (
      SELECT o.ot_outlet_code 
          ,v.lab_site_code ot_outlet_code 
          ,v.brand 
          ,v.region 
          , bd.cd_day_date booking_date, dd.cd_day_date dining_date 
          , f.last_change_date, f.created_date 
          , f.modified_date, t15.ts_timeslot_desc 
          , t.TIME, s.session_type 
          , tbs.booking_status, f.ADDED_BY_USER 
          , bp.product, bs.booking_source 
          , f.SPECIAL_OFFER, f.SEATING_PREFERENCE 
          , f.Tables_guest_id, covers 
          , booking_occurrence, breakfast_flag 
          , row_number() OVER (PARTITION BY f.Tables_guest_id ORDER BY f.last_change_date DESC, f.last_change_time DESC) rank_latest_record 
          , f.title, f.emailoptout 
          , f.MOBILE_OPT_IN, f.HIGH_CHAIR_COVERS 
          , f.GUEST_TYPE, f.Booking_ID 
      FROM owbi.whs_fact_rest_booking f 
          , owbi.whs_dim_cal_date bd 
          , owbi.whs_dim_cal_date dd 
          , owbi.whs_dim_bat_booking_source bs 
          , owbi.whs_dim_time_of_day t 
          , owbi.whs_dim_bat_product bp 
          , owbi.whs_dim_15_timeslot t15 
          , owbi.whs_dim_bat_booking_status tbs 
          , owbi.whs_dim_bat_session s 
          , owbi.bat_restaurants_v v 
     WHERE f.whs_dim_outlet = v.outlet 
    AND f.whs_dim_booking_date = bd.dimension_Key 
    AND f.whs_dim_dining_date = dd.dimension_key 
    AND f.whs_dim_bat_session = s.dimension_key 
    AND f.whs_dim_bat_booking_status = tbs.dimension_key 
    AND f.whs_dim_bat_product = bp.dimension_Key 
    AND f.whs_dim_bat_booking_source = bs.dimension_key 
    AND f.whs_dim_booking_time = t.dimension_Key 
    AND f.whs_dim_dining_15_timeslot = t15.dimension_key 
    AND dd.ey_year_code in ('2018') 
    AND f.whs_dim_dining_date >= 20170303 
     ) 
WHERE rank_latest_record = 1 
ORDER BY BOOKING_DATE DESC; 
+0

ご迷惑をおかけして申し訳ございませんが、あなたの質問が何であるか、どのような問題が発生しているか分かりません。 – pmbAustin

+1

このSQL文には、oracleでは動作しますが、私が知る限りSQL Serverでは動作しません。間違いましたか? – Hogan

+0

テーブルのスキーマは何ですか、E-R図を理解しようとします。このクエリから期待される結果は何か –

答えて

0

派生テーブルは、別名を持っている必要があります。それはインナーとしてそれらを書くために参加するために完全に合法だが、それは貧しいフォームと考えられていたSQL Serverでは例えば

SELECT * 
FROM (
      SELECT o.ot_outlet_code 
          ,v.lab_site_code ot_outlet_code 
          ,v.brand 
          ,v.region 
          , bd.cd_day_date booking_date, dd.cd_day_date dining_date 
          , f.last_change_date, f.created_date 
          , f.modified_date, t15.ts_timeslot_desc 
          , t.TIME, s.session_type 
          , tbs.booking_status, f.ADDED_BY_USER 
          , bp.product, bs.booking_source 
          , f.SPECIAL_OFFER, f.SEATING_PREFERENCE 
          , f.Tables_guest_id, covers 
          , booking_occurrence, breakfast_flag 
          , row_number() OVER (PARTITION BY f.Tables_guest_id ORDER BY f.last_change_date DESC, f.last_change_time DESC) rank_latest_record 
          , f.title, f.emailoptout 
          , f.MOBILE_OPT_IN, f.HIGH_CHAIR_COVERS 
          , f.GUEST_TYPE, f.Booking_ID 
      FROM owbi.whs_fact_rest_booking f 
          , owbi.whs_dim_cal_date bd 
          , owbi.whs_dim_cal_date dd 
          , owbi.whs_dim_bat_booking_source bs 
          , owbi.whs_dim_time_of_day t 
          , owbi.whs_dim_bat_product bp 
          , owbi.whs_dim_15_timeslot t15 
          , owbi.whs_dim_bat_booking_status tbs 
          , owbi.whs_dim_bat_session s 
          , owbi.bat_restaurants_v v 
     WHERE f.whs_dim_outlet = v.outlet 
    AND f.whs_dim_booking_date = bd.dimension_Key 
    AND f.whs_dim_dining_date = dd.dimension_key 
    AND f.whs_dim_bat_session = s.dimension_key 
    AND f.whs_dim_bat_booking_status = tbs.dimension_key 
    AND f.whs_dim_bat_product = bp.dimension_Key 
    AND f.whs_dim_bat_booking_source = bs.dimension_key 
    AND f.whs_dim_booking_time = t.dimension_Key 
    AND f.whs_dim_dining_15_timeslot = t15.dimension_key 
    AND dd.ey_year_code in ('2018') 
    AND f.whs_dim_dining_date >= 20170303 
     ) dt 
WHERE rank_latest_record = 1 
ORDER BY BOOKING_DATE DESC; 

は、ANSIスタイルの結合を使用しませWHERE句に結合条件と交差参加。

FROM句でサブクエリ/インラインビュー/派生テーブルの代わりにCTEを使用する方が一般的に優れています。

+1

サブクエリの代わりにCTEを使用する方が良いでしょうか?パフォーマンスの観点からは、それらはまったく同等でなければなりません。 –

+2

パフォーマンスの違いはありません。クエリの字句順は変換パイプラインの論理的順序に従うので、CTEは可読性に優れています。したがって、内側から外側に向かって検索するのではなく、上から検索することができます。 –

+0

@GordonLinoff - これは当てはまりません。多くの場合、CTEを使用して実行計画が変更されることがあります。 (私はDB2上でこれを広範にしかテストしていませんでした)。 – Hogan