Рефактор оператора SQL - PullRequest
0 голосов
/ 26 марта 2012

Следующее работает как положено.Показывает цену за тысячу показов и цену за клик по умолчанию для страны, если она отсутствует в исходной таблице.Я использую временную таблицу, и я хотел бы знать, можно ли это сделать без использования временной таблицы.

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 не находится в первичной таблице.Поэтому я не могу использовать самостоятельные левые соединения.Я хотел бы знать, есть ли лучший способ.

1 Ответ

2 голосов
/ 26 марта 2012

Для начала, с того места, где я стою, вы используете (временную) таблицу country_list в качестве таблицы PRIMARY и сопоставляете ее с ox_bidding_configuration, где это возможно (левое внешнее соединение); следовательно, ваш набор результатов содержит только страны SA & IN.

Хотя я не уверен на 100%, что этот синтаксис работает на MYSQL, но для TSQL я бы написал ваш запрос следующим образом:

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 = ''

ИМХО, это более понятно и, вероятно, немного быстрее, так как конфигурацию по умолчанию нужно получить только один раз.

Чтобы избавиться от таблицы 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 = ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...