SQL : 在现有元素上过滤新添加的元素
SQL : Filter the newly added elements on existing ones
我有一个 Model
包含 Property
es.
所以,我有一个 table Models
、一个 Table Properties
和一个 table ModelProperties
(ModelId、PropertyId、值)
实际上当一些新的 Property
is/are 添加时(在 table Properties
),我想更新 ModelProperties
table 将新添加的 Properties 添加到每个现有的 Models.
应该小心,因为一些新创建的模型可能已经具有新属性,所以为了正确更新我需要每个现有模型
Select 所有要添加到该模型的新属性(PropertyId
存在于 Properties
但不存在于 ModelProperties
中 ModelId
)
向模型添加它没有的新属性(具有空值)。
示例:
我的模型 1
和模型 2
的属性一直到 100。添加了两个新属性:101
和 102
。型号 2
已更新为 属性 101
,但尚未 102
。我的 selection 应该 give/update。我的 sql 应该给我 models/properties 更新:
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
select * from Properties p
left join ModelProperties mp on
mp.PropertyId = p.Id
where mp.PropertyId is NULL
如果您 CROSS JOIN
您的模型和您的属性,您可以使用 NOT EXISTS
删除那些在您的 ModelProperties
table 中有记录的那些,然后使用这个作为插入空属性的基础:
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
);
我有一个 Model
包含 Property
es.
所以,我有一个 table Models
、一个 Table Properties
和一个 table ModelProperties
(ModelId、PropertyId、值)
实际上当一些新的 Property
is/are 添加时(在 table Properties
),我想更新 ModelProperties
table 将新添加的 Properties 添加到每个现有的 Models.
应该小心,因为一些新创建的模型可能已经具有新属性,所以为了正确更新我需要每个现有模型
Select 所有要添加到该模型的新属性(
PropertyId
存在于Properties
但不存在于ModelProperties
中ModelId
)向模型添加它没有的新属性(具有空值)。
示例:
我的模型 1
和模型 2
的属性一直到 100。添加了两个新属性:101
和 102
。型号 2
已更新为 属性 101
,但尚未 102
。我的 selection 应该 give/update。我的 sql 应该给我 models/properties 更新:
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
select * from Properties p
left join ModelProperties mp on
mp.PropertyId = p.Id
where mp.PropertyId is NULL
如果您 CROSS JOIN
您的模型和您的属性,您可以使用 NOT EXISTS
删除那些在您的 ModelProperties
table 中有记录的那些,然后使用这个作为插入空属性的基础:
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
);