我在这里发现了一些类似的问题,但似乎没有一个真正适合我的情况。
我正在做的表格是这样的,它是一个记录学生在课程上表现的表格:
| STUDENT_ID | COURSE_ID | ENROLLMENT_TYPE | MARK | STATUS | VERSION |
| | | | | | |
| 1234 | 5678 | Mandatory | 70 | ACTIVE | 2 |
| 1234 | 5678 | Optional | 70 | HISTORY | 1 |
| 1234 | 5678 | Optional | null | HISTORY | 0 |
| 9876 | 4597 | Institutional | 99 | ACTIVE | 1 |
| 9876 | 4597 | Institutional | null | HISTORY | 0 |
我需要将此表与另一个表合并,该表根据学生的组跟踪学生的注册情况,以便我可以根据需要插入或更新行:
| GROUP_ID | STUDENT_ID | COURSE_ID | ENROLLMENT_TYPE |
| 4976555 | 1234 | 5678 | Mandatory |
| 6399875 | 1234 | 9034 | Optional |
| 6399875 | 9876 | 4597 | Institutional |
长话短说,我需要检查注册类型是否相同或已更改,因为有些学生根据他们所属的组注册课程,但组可以在一夜之间更改。
到这里为止一切都很好,但是如果行匹配,我还需要复制我要更新的行并将其设置为“HISTORY”,这样我们就可以记录对某行进行的所有更新。
目前,我有一个典型的
MERGE INTO performance USING group_enrollments
ON performance.STUDENT_ID = group_enrollments.STUDENT_ID
AND performance.COURSE_ID = group_enrollments.COURSE_ID
WHEN MATCHED THEN UPDATE ......
WHEN NOT MATCHED THEN INSERT ......
在我之前做这部分代码的人认为在合并之前复制所有的行作为“HISTORY”行是一个好主意,但是这给我们带来了问题,因为这个过程每天晚上都运行,每次写入超过150.000行。
16/01 12.34:更新了有关表及其关系的更多信息
1条答案
按热度按时间v7pvogib1#
好了,首先,我会写一个查询,生成要更新和/或插入的行:
此查询首先查找所有全新的行(即group_enrollment表中的行在performance表中没有行)或具有不同enrollment_type的行。这些是需要插入或更新的行。
一旦我们知道了这一点,我们就可以连接一个虚拟的2行表,这样我们就可以连接到第一个虚拟行,不管我们是需要插入还是更新,但是如果我们需要更新,我们只会连接到第二个虚拟行。这意味着我们只有一行用于插入,但是两行用于更新。
然后很容易根据www.example.com输出正确的值dummy.id(第一个虚拟行是新值,第二个虚拟行是旧值)。
一旦我们完成了这些,我们就知道哪些数据需要合并到性能表中,所以现在merge语句看起来像这样:
为了澄清的目的,这里有一个非常简单的行的条件复制的例子(我们也可以称之为部分交叉连接,因为一个表中的所有行都至少连接到另一个表中的一行):
可以看到,对于sample_data“table”中id=101的行,我们有两行,但其他两个id各只有一行。
希望这能让你明白一些事情?