Есть код, в котором я могу объединить все 5 таблиц вместе, и он отлично работает. Но я хочу сделать из него временную таблицу, чтобы мне было легче работать дальше с этими строками, а с create temporary table это не работает. Так не могли бы вы показать мне, как это сделать правильно?

select * from city
    join shipment sh on city.city_id=sh.city_id
    join customer cus on sh.cust_id=cus.cust_id
    join driver dr on sh.driver_id=dr.driver_id
    join truck tr on  sh.truck_id=tr.truck_id

Ошибка

Повторяющееся имя столбца «city_id»

1
Yonko 3 Фев 2022 в 16:48
1
Что вы подразумеваете под "это не работает"? Пожалуйста, опубликуйте детали утверждения, которое не работает, а также любые доказательства, которые у вас есть (возможно, сообщение об ошибке?), что оно не работает. Если он делает что-то, но не то, что вы намеревались, пожалуйста, опубликуйте подробности вашего предполагаемого результата.
 – 
FlexYourData
3 Фев 2022 в 16:51
Почему бы вместо этого не создать представление?
 – 
jarlh
3 Фев 2022 в 16:51
Пожалуйста, покажите, что вы пробовали и какое сообщение об ошибке вы получили в ответ. Также, пожалуйста, опишите ваши таблицы. Вы можете легко сделать это, запустив select TABLE_NAME, COLUMN_NAME, COLUMN_TYPE from information_schema.tables where TABLE_NAME in ('shipment', 'customer', 'driver', 'truck') order by TABLE_NAME, COLUMN_NAME;
 – 
Lajos Arpad
3 Фев 2022 в 17:10
Я пытаюсь, как в примере ниже, и выдает ошибку [Код: 1060, состояние SQL: 42S21] Повторяющееся имя столбца «city_id».
 – 
Yonko
3 Фев 2022 в 17:17
Означает, что он говорит - использование * (выбор всех столбцов из всех таблиц) здесь просто неправильно, вы должны указать столбцы, которые вам нужны, полностью уточненные по имени таблицы, чтобы избежать дублирования имен столбцов, которые у вас явно есть в городе и отгрузке. cust_id, driver_id и truck_id также являются четкими дубликатами
 – 
P.Salmon
3 Фев 2022 в 17:21

2 ответа

Чтобы создать временную таблицу, вы должны иметь привилегию CREATE TEMPORARY TABLES. - Прочтите об этом здесь: https://dev. mysql.com/doc/refman/8.0/en/create-temporary-table.html

Когда у вас есть это, вы можете сделать что-то вроде этого:

CREATE temporary TABLE name_of_temp_table
  SELECT *
  FROM   city
         JOIN shipment sh
           ON city.city_id = sh.city_id
         JOIN customer cus
           ON sh.cust_id = cus.cust_id
         JOIN driver dr
           ON sh.driver_id = dr.driver_id
         JOIN truck tr
           ON sh.truck_id = tr.truck_id 

Тем не менее, есть также возможность создать представление, такое как:

https://dev.mysql.com/doc/refman/8.0/en/create-view.html

CREATE VIEW name_of_view
AS
  SELECT *
  FROM   city
         JOIN shipment sh
           ON city.city_id = sh.city_id
         JOIN customer cus
           ON sh.cust_id = cus.cust_id
         JOIN driver dr
           ON sh.driver_id = dr.driver_id
         JOIN truck tr
           ON sh.truck_id = tr.truck_id 
1
Ben 3 Фев 2022 в 16:55
Да, я попробовал, и выдает следующую ошибку: [Код: 1060, состояние SQL: 42S21] Повторяющееся имя столбца «city_id». Я думаю, это потому, что в разных таблицах есть одни и те же столбцы. То же относится и к View.
 – 
Yonko
3 Фев 2022 в 17:09
Тогда у вас проблема не с созданием временной таблицы, а с самим запросом. Я полагаю, что в вашей таблице city нет city_id, а есть только id, что имело бы больше смысла, и тогда в ваших соединениях вы не должны делать city.city_id = sh.city_id но city.id = sh.city_id. Пожалуйста, проверьте, работает ли ваш запрос должным образом, и правильно ли настроены столбцы в таблицах.
 – 
Ben
3 Фев 2022 в 17:22

Проблема в том, что у вас есть столбцы с одинаковым именем в нескольких таблицах. Чтобы это не вызывало проблем, вам нужно будет перечислить свои столбцы, например

select TABLE_NAME, COLUMN_NAME, COLUMN_TYPE 
from information_schema.columns 
where TABLE_NAME in ('city', 'shipment', 'customer', 'driver', 'truck') 
order by COLUMN_NAME, TABLE_NAME;

Вам нужно будет выяснить, какие из них дублируются.

На самом деле вы можете генерировать свои части запроса следующим образом:

select CONCAT('insert into yourtable(', GROUP_CONCAT(COLUMN_NAME), ') values ' GROUP_CONCAT('(''', existing.TABLE_NAME, '''.''', existing.COLUMN_NAME, ''')'))
from information_schema.columns existing
left join information_schema.columns notexisting
on existing.TABLE_NAME in ('city', 'shipment', 'customer', 'driver', 'truck') and
   notexisting.TABLE_NAME in ('city', 'shipment', 'customer', 'driver', 'truck') and
   CONCAT('''', existing.TABLE_NAME, '''.''', existing.COLUMN_NAME, '''') < CONCAT('''', notexisting.TABLE_NAME, '''.''', notexisting.COLUMN_NAME, '''')
where nonexisting.TABLE_NAME is null

(непроверено)

В любом случае вам нужно будет избегать дублирования имен столбцов в определении вашей временной таблицы.

0
Lajos Arpad 3 Фев 2022 в 17:40