Вставка в команду ничего не вставляет, но оператор select возвращает все необходимые элементы

#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 числа, которые он должен выдавать