Как написать оператор создания таблицы, который содержит левое соединение? - PullRequest
0 голосов
/ 12 марта 2020

Я могу получить левое соединение со следующим оператором mysql: Определение полей таблицы:

 show columns from back;
+-------------------------+------------+------+-----+---------+-------+
| Field                   | Type       | Null | Key | Default | Extra |
+-------------------------+------------+------+-----+---------+-------+
| code                    | text       | YES  |     | NULL    |       |
| report_date             | varchar(4) | YES  |     | NULL    |       |
| total_operating_revenue | double     | YES  |     | NULL    |       |
+-------------------------+------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

Я загрузил таблицу в dropbox

Скачать заднюю таблицу для тест mysql оператор

Мой запрос.

select * from ((
    select *  from  back   
    ) a 
left join(    
    select * from  back  
    ) b on  a.report_date  = b.report_date + 1 
            and  a.code = b.code);

Теперь я хочу переписать его как create table выражение:

create table result as(( 
    select *  from  back   
    ) a 
left join(    
    select * from  back  
    ) b on  a.report_date  = b.report_date + 1 
            and  a.code = b.code);

Я столкнулся с проблемой:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '( 
    select *  from  back   
    ) a 
left join(    
    select * from  back  ' at line 1

Как написать таблицу создания оператор, который содержит левое соединение?
@ Barmar, оба метода сталкиваются с одной и той же ошибкой: ОШИБКА 1060 (42S21): повторяющееся имя столбца 'code'

MariaDB [finance]> create table result as( 
    -> select * from ((
    ->     select *  from  back   
    ->     ) a 
    -> left join(    
    ->     select * from  back  
    ->     ) b on  a.report_date  = b.report_date + 1 
    ->             and  a.code = b.code));

ОШИБКА 1060 (42S21): дублирующееся имя столбца ' код '

Второй способ:

MariaDB [finance]> CREATE TABLE result AS
    -> SELECT *
    -> FROM back AS a
    -> LEFT JOIN back AS b ON a.report_date = b.report_date + 1 AND a.code = b.code;
ERROR 1060 (42S21): Duplicate column name 'code'

Моя последняя попытка:

create table result as 
select a.code,a.report_date,a.total_operating_revenue,b.code,b.report_date,b.total_operating_revenue from (
    select a.code,a.report_date,a.total_operating_revenue  from  back   
    ) a 
left join(    
    select b.code,b.report_date,b.total_operating_revenue from  back  
    ) b on  a.report_date  = b.report_date + 1 
            and  a.code = b.code;

Неизвестная ошибка столбца:

ERROR 1054 (42S22): Unknown column 'a.code' in 'field list'

Ответы [ 3 ]

2 голосов
/ 12 марта 2020

Просто поставьте create table result перед исходным запросом.

create table result as
select * from ((
    select *  from  back   
    ) a 
left join(    
    select * from  back  
    ) b on  a.report_date  = b.report_date + 1 
            and  a.code = b.code);

или без всех подзапросов:

CREATE TABLE result AS
SELECT *
FROM back AS a
LEFT JOIN back AS b ON a.report_date = b.report_date + 1 AND a.code = b.code

Однако при использовании самостоятельного соединения с SELECT * попытается создать повторяющиеся имена столбцов в новой таблице, что, я думаю, вызовет еще одну ошибку. Вы должны выбрать указанные c столбцы, и если вам нужен один и тот же столбец из a и b, вы должны дать им разные псевдонимы для новых столбцов таблицы.

0 голосов
/ 12 марта 2020
CREATE TABLE result AS
select * from ((
    select code as a_code ,report_date as a_report_date,total_operating_revenue as a_revenue from  back   
    ) a 
left join(    
    select code as b_code ,report_date as b_report_date,total_operating_revenue as b_revenue  from  back 
    ) b on  a_report_date  = b_report_date + 1 
            and  a_code = b_code);
0 голосов
/ 12 марта 2020

edit

Вы можете использовать этот запрос для создания таблицы с левым соединением и вашим условием

create table result as
select a.* from back a
left join back b on (a.report_date = b.report_date + 1) and a.code = b.code;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...