SQL : 在现有元素上过滤新添加的元素

SQL : Filter the newly added elements on existing ones

我有一个 Model 包含 Propertyes.

所以,我有一个 table Models、一个 Table Properties 和一个 table ModelProperties(ModelId、PropertyId、值)

实际上当一些新的 Property is/are 添加时(在 table Properties),我想更新 ModelProperties table 将新添加的 Properties 添加到每个现有的 Models.

the SQL Fiddle here

应该小心,因为一些新创建的模型可能已经具有新属性,所以为了正确更新我需要每个现有模型

  1. Select 所有要添加到该模型的新属性(PropertyId 存在于 Properties 但不存在于 ModelPropertiesModelId)

  2. 向模型添加它没有的新属性(具有空值)。

示例: 我的模型 1 和模型 2 的属性一直到 100。添加了两个新属性:101102。型号 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
        );

Example on SQL Fiddle