2017-04-13 12 views
0
set @fuel_type='hsd'; 
select 
ro.ro_id, 

(case 
    when if(@fuel_type='ms',r.ms_field_input_id,r.hsd_field_input_id)= 0 
    then if(@fuel_type='ms',concat(r.remark_ms,r.remark_branded),r.remark_hsd) 
    else 
    f.field_name 
end) 

from 
retail_outlets ro left join 
volume_trackers r on ro.ro_id=r.ro_id, 
field_inputs_master f 
where 
    if(@fuel_type='ms',r.ms_field_input_id = f.field_id,r.hsd_field_input_id=f.field_id) 
    and ro.pricing_module=1 and if(@fuel_type='ms',ro.ms,ro.hsd)=1 and  r.date_inserted='2017-02-06' 
    ; 

は私がdisplayes左外側は

+0

左側の結合の右側の表からwhere句の条件を結合に移動します。何が起こっているのは、where句の制限がnull値を考慮しないため、null値が除外されているということです。別の言い方をすると、where句を使うと、left joinは内側joinのように振る舞います。具体的には、 'r.date_inserted = '2017-02-06''を結合critieraに移動する必要があります – xQbert

+1

そして、表記を混在させないでください。あなたは本当にfrom節で '、'を使用してはいけません。 – xQbert

+0

@xQbert r.date_insertedをジョイン基準に移動しようとしましたが、それでも動作しませんでした。 –

答えて

0

正でないボリュームトラッカーテーブルと一致しているすべてのretail_outletsテーブルのro_idだけro_idを表示する必要があり、左テーブルの上にすべての行を返すdoes notの参加が、私はこれを考えますあなたが何をしているのか

変更は以下の通りである:

  1. 除去し、表記及び左
  2. 参加基準にr.date_inserted移動加入注入します。
  3. 私は左の結合を使用した理由について、新しい左の結合へのjoinとcase文への変更のwhere句を移動しました。すでに左の結合であるRに戻るので、左に続けると意味がありました合流...
  4. いくつかの不要な()削除2017年2月6日 『暗黙的に正しくキャストされている「r.date_insertedの

仮定は、VARCHAR2データ型またはがあります』。

SET @fuel_type='hsd'; 

SELECT 
    ro.ro_id , 

    CASE 
     WHEN IF(@fuel_type='ms',r.ms_field_input_id,r.hsd_field_input_id)= 0 
     THEN IF(@fuel_type='ms',concat(r.remark_ms,r.remark_branded),r.remark_hsd) 
     ELSE f.field_name 
    END 
FROM retail_outlets ro 
LEFT JOIN volume_trackers r 
    ON ro.ro_id = r.ro_id 
    AND r.date_inserted = '2017-02-06' 
LEFT JOIN field_inputs_master f 
    ON f.field_id = CASE WHEN @fuel_type='ms' 
         THEN r.ms_field_input_id 
         ELSE r.hsd_field_input_id 
        END 
WHERE ro.pricing_module=1 
    AND IF(@fuel_type ='ms',ro.ms,ro.hsd)=1; 
+0

field_inputs_masterの後にf.fieldを書き込むことはできませんf –

+0

キーワードonを忘れました。 – xQbert

+0

'2017-02-06'が正しくキャストされています –

関連する問題