У меня есть Model
, содержащий Property
es.
Итак, у меня есть таблица Models
, таблица Properties
и таблица ModelProperties
(ModelId, PropertyId, Value)
На самом деле, когда некоторые новые Property
добавляются (в таблицу Properties
), я хотел бы также обновить таблицу ModelProperties
до добавить вновь добавленный Характеристики к каждому из существующих Модели.
См. скрипт SQL здесь
Следует быть осторожным, потому что некоторые из вновь созданных моделей уже могут иметь новые свойства, поэтому для правильного обновления мне нужно, чтобы каждая из существующих моделей
Выберите все новые свойства для добавления к этой модели (PropertyId
существуют в Properties
, но не в ModelProperties
для этой ModelId
)
Добавьте в модель новые свойства, которых у нее нет (с пустыми значениями).
Пример:
У меня есть Модель 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 Server? T-SQL не использует обратные апострофы (`
) для идентификации разделителей (он использует двойные кавычки ANSI ("
) и квадратные скобки ([]
)), int
имеет ли нет точность, а unsigned
также не является допустимым свойством для int
.
Да, это имеет значение, если вы используете SQL Server, предоставьте действительный T-SQL; указанный выше недействителен T-SQL, он не работает: дб <> рабочий пример. Если вы используете MySQL, то пометьте [mysql]... Пометка [sql-сервер], когда вы спрашиваете о MySQL, аналогична пометке VB.Net, когда вы спрашиваете о Java.
@Larnu обновил скрипку, ссылку и код в OP
Если вы 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 не загружается для меня. Если вы включаете DDL и DML, это также должно быть в вопросе; рабочий пример должна комплимент сообщение не требуется.