gpt4 book ai didi

sql - 使用另一张表上多行的数据高效更新一张表上的一行

转载 作者:行者123 更新时间:2023-12-04 16:47:33 25 4
gpt4 key购买 nike

所以在我的数据库中,我有两个具有多对一关系的表。我试图通过查看“子”表上的所有行来更新“父”表(抱歉,如果我在这里没有使用正确的术语)并对数据应用不同的规则集以确定要更新的值和。但我想高效地(也就是说,快速地)做到这一点。

因此,假设以下表格。

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;

无论哪种方式,我都觉得自己在做额外的工作。第一种方式感觉更糟,因为看起来我做了太多的选择语句(每个规则我必须应用一个,而且有很多)。第二种方式我只需要回到光标前面,而不是再做一次select,但感觉还是应该有更高效的方式。同时,oracle 有很好的幕后优化,所以任何一种方式都可能被优化为最好的幕后方式。

所以我的问题是执行此类更新的最快方法是什么,或者我可以不担心优化它而 oracle 会为我处理它吗?

编辑:使示例更复杂一些。

最佳答案

你可以像这样做除了眼睛颜色模式之外的任何事情:

UPDATE Parent
SET (Number_Of_Children, Average_Child_Age, Oldest_Child_Age, Youngest_Child_Age) = (
SELECT COUNT(*), AVG(Age), MAX(Age), MIN(Age)
FROM Child
WHERE Parent.ID = Child.Parent_ID
)

我想不出一种方法来适应那里的模式。在 SQL 中,这通常是一项艰巨的计算,我认为由于以下情况,它不适合存储在列中:

  • 三个 child ,每个 child 都有不同的眼睛颜色:要么没有模式,要么有三种模式(每种眼睛颜色一种),具体取决于您问谁 - 有些人会回答“两者都有”。
  • 三个 child ,其中两个眼睛是绿色的:好的,绿色是这里的模式,没问题。
  • 四个 child ,两个棕色眼睛,两个蓝色眼睛:棕色和蓝色都是模式。

希望对您有所帮助;可能是您为简化问题所做的努力虽然出色,但却让我走错了路:) 让我知道。

关于sql - 使用另一张表上多行的数据高效更新一张表上的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16614803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com