2012-03-26 10 views
0

次は期待どおりに動作しています。国が元の表にない場合の国のデフォルトCPMとCPCが表示されます。 一時テーブルを使用しています。一時テーブルを使用せずに実行できるかどうかを知りたいと思います。SQLステートメントのリファクタ

mysql> create temporary table country_list (country_name varchar(100)); 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into country_list values ('IN'), ('SA'); 
Query OK, 2 rows affected (0.00 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

select dt.country_name as country, dt.operator, 
if (dt.cpm is null, (SELECT cpm FROM ox_bidding_configuration where country = '' and operator = ''), dt.cpm) as updated_cpm, 
if (dt.cpc is null, (SELECT cpc FROM ox_bidding_configuration where country = '' and operator = ''), dt.cpc) as updated_cpc, 
if (dt.cpa is null, (SELECT cpa FROM ox_bidding_configuration where country = '' and operator = ''), dt.cpa) as updated_cpa 
from (
select a.country_name, b.operator, cpm, cpc, cpa from country_list as a left join ox_bidding_configuration as b on a.country_name = b.country group by b.country, b.operator, cpm, cpc, cpa) as dt; 
+---------+----------+-------------+-------------+-------------+ 
| country | operator | updated_cpm | updated_cpc | updated_cpa | 
+---------+----------+-------------+-------------+-------------+ 
| SA  | NULL  |  1.0000 |  1.0000 |  1.0000 | 
| IN  |   |  2.0000 |  2.0000 |  2.0000 | 
| IN  | abcd  |  11.0000 |  23.0000 |  4.0000 | 
+---------+----------+-------------+-------------+-------------+ 

国SAはプライマリテーブルにありません。だから私は自己の左の結合を使用することはできません。より良い方法があるかどうかを知りたいと思います。

答えて

2

私が立っているところでは、(一時的な)country_listテーブルをPRIMARYテーブルとして使用し、可能な場合はox_bidding_configurationと一致させます(左外部結合)。結果セットには国番号SA & INのみが含まれています。

私はこの構文は、MySQLで動作し、TSQLに使用されている私のようにクエリを記述し、100%はわからないが:

SELECT dt.country_name as country, 
     dt.operator, 
     COALESCE(dt.cpm, def.cpm) as updated_cpm, 
     COALESCE(dt.cpc, def.cpc) as updated_cpd, 
     COALESCE(dt.cpa, def.cpa) as updated_cpa 
    FROM (SELECT DISTINCT a.country_name, 
         b.operator, 
         b.cpm, 
         b.cpc, 
         b.cpa 
      FROM country_list a 
      LEFT OUTER JOIN ox_bidding_configuration as b 
         ON b.country = a.country_name) dt 
    LEFT OUTER JOIN ox_bidding_configuration def 
       ON def.country = '' 
       AND def.operator = '' 

IMHO、これはより明確である、として、おそらくそれはあまりにも若干速いですデフォルトの設定は一度だけフェッチする必要があります。

country_listテーブルを削除するには、インラインクエリに変換することができますが、率直に言って、私はそれの利益を見ません。

以下の線に沿って何か:

SELECT dt.country_name as country, 
     dt.operator, 
     COALESCE(dt.cpm, def.cpm) as updated_cpm, 
     COALESCE(dt.cpc, def.cpc) as updated_cpd, 
     COALESCE(dt.cpa, def.cpa) as updated_cpa 
    FROM (SELECT DISTINCT a.country_name, 
         b.operator, 
         b.cpm, 
         b.cpc, 
         b.cpa 
      FROM (SELECT 'SA' AS country_name 
       UNION ALL 
       SELECT 'IN') a 
      LEFT OUTER JOIN ox_bidding_configuration as b 
         ON b.country = a.country_name) dt 
    LEFT OUTER JOIN ox_bidding_configuration def 
       ON def.country = '' 
       AND def.operator = '' 
+0

PS:かなり多くの未テストに、あなたはここにタイプミスを修正する必要がある場合がありますので、そこ – deroby

+0

は物事のカップルを修正しました。 SQLサーバの 'ISNULL()'には、MySQLに相当する 'IFNULL()'があります。または両方で動作するANSI 'COALESCE()' –

+0

ああ、thx、もう一度学んだこと...私はそれを念頭に置くようにしようとします。 – deroby