所以在我的数据库中,我有两个具有多对一关系的表。我正在尝试通过查看“子”表上的所有行来更新“父”表(对不起,如果我在这里没有使用正确的术语)并对数据应用不同的规则集以确定要更新的值和。但我想有效地做到这一点(也就是说,快速)。
因此,假设以下表格。
PARENT(
ID NUMBER,
NAME VARCHAR(20),
NUMBER_OF_CHILDREN NUMBER,
AVERAGE_CHILD_AGE NUMBER,
OLDEST_CHILD_AGE NUMBER,
YOUNGEST_CHILD_AGE NUMBER,
MODE_EYE_COLOR VARCHAR(20),
EVERY_CHILD_MADE_A VARCHAR(1),
BLOODTYPES_THAT_CAN_BE_ACCEPTED VARCHAR(100),
SOMETHING_COMPLEX COMPLEX_OBJECT_1
)
CHILD(
ID NUMBER,
PARENT_ID NUMBER,
AGE NUMBER,
EYE_COLOR VARCHAR(20),
MADE_AN_A VARCHAR(1),
BLOODTYPE VARCHAR(5),
COMPLEXITY COMPLEX_OBJECT_2
)
我使用了简化的示例,需要应用的实际规则比最小/最大/平均要复杂一些。现在,这是我认为可以做到的两种方式。第一个是让过程将父 ID 传递给函数(我使用单独的函数,因此稍后返回并维护此代码更容易),每个人都选择孩子然后处理它们。第二种方法是打开一个选择子项的游标,然后将游标传递给每个函数。
PROCEDURE UPDATE_PARENT_1 (PARENT_ID IN NUMBER)
BEGIN
UPDATE PARENT
SET
NUMBER_OF_CHILDREN = CHILD_COUNT_FUNCTION(PARENT_ID),
AVERAGE_CHILD_AGE = CHILD_AGE_AVERAGE_FUNCTION(PARENT_ID),
OLDER_CHILD_AGE = PICK_OLDEST_AGE_FUNCTION(PARENT_ID),
YOUNGEST_CHILD_AGE = PICK_YOUNGEST_AGE_FUNCTION(PARENT_ID),
MODE_EYE_COLOR = MOST_OFTEN_EYE_COLOR_FUNCTION(PARENT_ID),
BLOODTYPES_THAT_CAN_BE_ACCEPTED = DETERMINE_BLOOD_DONOR_TYPES(PARENT_ID),
SOMETHING_COMPLEX = COMPLEX_FUNCTION(PARENT_ID)
WHERE
ID = PARENT_ID;
END;
PROCEDURE UPDATE_PARENT_2 (PARENT_ID IN NUMBER)
CURSOR C IS SELECT * FROM CHILD WHERE CHILD.PARENT_ID = PARENT_ID
BEGIN
OPEN C;
UPDATE PARENT
SET
NUMBER_OF_CHILDREN = CHILD_COUNT_FUNCTION(C),
AVERAGE_CHILD_AGE = CHILD_AGE_AVERAGE_FUNCTION(C),
OLDER_CHILD_AGE = PICK_OLDEST_AGE_FUNCTION(C),
YOUNGEST_CHILD_AGE = PICK_YOUNGEST_AGE_FUNCTION(C),
MODE_EYE_COLOR = MOST_OFTEN_EYE_COLOR_FUNCTION(C)
BLOODTYPES_THAT_CAN_BE_ACCEPTED = DETERMINE_BLOOD_DONOR_TYPES(C),
SOMETHING_COMPLEX = COMPLEX_FUNCTION(C)
WHERE
ID = PARENT_ID;
CLOSE C;
END;
无论哪种方式,我都觉得我在做额外的工作。第一种方式感觉更糟,因为看起来我做了太多的选择语句(我必须应用的每个规则都有一个,而且有很多)。第二种方式我只需要回到光标的前面而不是再做一次选择,但感觉还是应该有更有效的方式。同时,oracle 有很好的幕后优化,因此任何一种方式都可能被优化为在幕后进行的最佳方式。
所以我的问题是进行这种更新的最快方法是什么,或者我可以不用担心优化它,oracle 会为我处理它吗?
编辑:使示例更复杂一些。