#sql #database #postgresql
#sql #База данных #postgresql
Вопрос:
У меня есть таблица SQL с именем Listing
, которая представляет дома, которые были арендованы. В таблице есть первичный ключ id
и другой столбец с именем amenities
, содержащий то, что мог предложить каждый дом. Удобства каждого дома отделены друг от друга запятой. Например, телевизор, Интернет, ванная.
Я использовал следующие команды для создания таблицы под названием Amenity со всеми уникальными предлагаемыми удобствами и СЕРИЙНЫМ номером для каждого удобства.
CREATE TABLE Amenity
AS
(SELECT DISTINCT
regexp_split_to_table(amenities,',')
FROM Listing);
ALTER TABLE Amenity
RENAME regexp_split_to_table to amenity_name;
ALTER TABLE Amenity ADD COLUMN amenity_id SERIAL;
ALTER TABLE Amenity ADD PRIMARY KEY(amenity_id);
Теперь мне нужно соединить две мои таблицы, которые имеют отношение «многие ко многим», используя новую таблицу, которая будет примерно такой:
Таблица HOUSE_AMENITIES
---------- ------------
| house_id | amenity_id |
---------- ------------
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
---------- ------------
Итак, я использовал следующий код, а затем планировал удалить столбец am_name
из Amenity_connect_to_Listing
.
CREATE TABLE Amenity_connect_to_Listing
AS
(SELECT regexp_split_to_table(amenities, ','), id
FROM Listing);
ALTER TABLE Amenity_connect_to_Listing
RENAME COLUMN id TO listing_id;
ALTER TABLE Amenity_connect_to_Listing
RENAME COLUMN regexp_split_to_table TO am_name;
ALTER TABLE Amenity_connect_to_Listing
ADD COLUMN amen_id int;
INSERT INTO Amenity_connect_to_Listing(amen_id)
(SELECT amenity_id FROM Amenity
JOIN Amenity_connect_to_Listing ON Amenity_connect_to_Listing.am_name like Amenity.amenity_name);
Моя проблема здесь в том, что последняя команда выводит INSERT 0 172123
что означает, что, хотя было выбрано 172123 элемента, ни один из них не был вставлен в таблицу Amenity_connect_to_Listing
, и я не знаю ни почему это произошло, ни как это исправить. Я проверил другие вопросы с несколько похожей проблемой, но ни один из них не использовался JOIN
, и ни один из других ответов, похоже, не сработал в моей ситуации.
Ответ №1:
Запустите запрос для вставки без инструкции insert. Вы не получаете обновлений, поскольку либо
- ваше внутреннее соединение с amenity_connect_to_listing неверно
- в amenity_connect_to_listing нет связанных записей
Как только запрос вернет то, что вы хотите, добавьте оператор insert обратно. Я подозреваю, что вместо
like Amenity.amenity_name
вам нужно
like '%' Amenity.amenity_name '%'
Комментарии:
1. Если вы хотите запустить
SELECT amenity_id FROM Amenity JOIN Amenity_connect_to_Listing ON Amenity_connect_to_Listing.am_name like Amenity.amenity_name;
, я попробовал, и он выдал мне 172123 числа, которые он должен выдавать