SQL: отфильтровать вновь добавленные элементы по существующим.

У меня есть Model, содержащий Propertyes.

Итак, у меня есть таблица Models, таблица Properties и таблица ModelProperties (ModelId, PropertyId, Value)

На самом деле, когда некоторые новые Property добавляются (в таблицу Properties), я хотел бы также обновить таблицу ModelProperties до добавить вновь добавленный Характеристики к каждому из существующих Модели.

См. скрипт SQL здесь

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

  1. Выберите все новые свойства для добавления к этой модели (PropertyId существуют в Properties, но не в ModelProperties для этой ModelId)

  2. Добавьте в модель новые свойства, которых у нее нет (с пустыми значениями).

Пример: У меня есть Модель 1 и Модель 2 со свойствами до 100. Добавлено два новых свойства: 101 и 102. Модель 2 была обновлена ​​до свойства 101, но еще не 102. Мой выбор должен дать/обновить. Мой sql должен дать мне модели/свойства для обновления:

ModelIdToUpdate PropertyIdToAdd

1               101
1               102

2               102

Вопрос: Каким должен быть sql-скрипт, чтобы получить результат выше?

SQL

CREATE TABLE "Models" (
  "Id" int NOT NULL,
  PRIMARY KEY ("Id")
);
CREATE TABLE "Properties" (
  "Id" int NOT NULL,
  PRIMARY KEY ("Id")
);
CREATE TABLE "ModelProperties" (
  "ModelId" int NOT NULL,
  "PropertyId" int NOT NULL,
  "Value" int NULL,
  PRIMARY KEY ("ModelId", "PropertyId")
);

INSERT INTO "Models"     ("Id") VALUES (1), (2);    
INSERT INTO "Properties" ("Id") VALUES (99), (100); -- existing    
INSERT INTO "Properties" ("Id") VALUES (101), (102); -- new
  
INSERT INTO "ModelProperties" ("ModelId", "PropertyId") VALUES
  (1, 99), (1, 100),
  (2, 99), (2, 100), (2, 101); -- Model 2 updated to 101```

выбор

select * from Properties p
left join ModelProperties mp on 
mp.PropertyId = p.Id
where mp.PropertyId is NULL

Скрипка SQL не загружается для меня. Если вы включаете DDL и DML, это также должно быть в вопросе; рабочий пример должна комплимент сообщение не требуется.

Larnu 17.05.2022 11:19

Вы уверены, что используете SQL Server? T-SQL не использует обратные апострофы (`) для идентификации разделителей (он использует двойные кавычки ANSI (") и квадратные скобки ([])), int имеет ли нет точность, а unsigned также не является допустимым свойством для int.

Larnu 17.05.2022 11:24

Да, это имеет значение, если вы используете SQL Server, предоставьте действительный T-SQL; указанный выше недействителен T-SQL, он не работает: дб <> рабочий пример. Если вы используете MySQL, то пометьте [mysql]... Пометка [sql-сервер], когда вы спрашиваете о MySQL, аналогична пометке VB.Net, когда вы спрашиваете о Java.

Larnu 17.05.2022 11:30

@Larnu обновил скрипку, ссылку и код в OP

serge 17.05.2022 11:41
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
4
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы CROSS JOIN свои модели и свои свойства, вы можете использовать NOT EXISTS для удаления тех, у которых есть запись в вашей ModelProperties таблице, а затем использовать это как основу для вставки ваших пустых свойств:

INSERT INTO ModelProperties (ModelId, PropertyId)
SELECT  m.Id,
        p.Id
FROM    Properties p
        CROSS JOIN Models AS m
WHERE   NOT EXISTS 
        (   SELECT  1 
            FROM    ModelProperties AS mp 
            WHERE   mp.ModelId = m.Id 
            AND     mp.PropertyId = p.Id
        );

Пример на скрипте SQL

отлично, именно то, что мне было нужно! большое спасибо, вы спасли мой день :)

serge 17.05.2022 11:48

Другие вопросы по теме