我有一個Model包含Propertyes。
所以,我有一個表Models、一個表Properties和一個表ModelProperties(ModelId、PropertyId、Value)
實際上,當Property添加一些新的(在 table 中Properties)時,我也想更新ModelPropertiestable 以將新添加的Properties添加到每個現有Models中。
在此處查看SQL Fiddle
應該小心,因為一些新創建的模型可能已經具有新屬性,所以為了正確更新我需要為每個現有模型
選擇要添加到該模型的所有新屬性(
PropertyId存在于其中Properties但不存在于該模型ModelProperties中ModelId)將它沒有的新屬性添加到模型中(使用空值)。
示例:
我有 Model1和 Model2的屬性直到 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
uj5u.com熱心網友回復:
如果您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 Fiddle 示例
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476276.html
