Oracle 中的 jOOq MERGE
jOOq MERGE In Oracle
感觉我已经很接近了,但是我不知道如何在 jOOq 中做类似下面的事情。
MERGE INTO USER_ASSIGNMENTS ua
USING (
SELECT core_object_id
FROM core_objects
WHERE exists(SELECT *
FROM LKU_CODE lc JOIN LKU_CODE_TYPE lct
ON lc.LKU_CODE_TYPE_ID = lct.LKU_CODE_TYPE_ID AND lct.CODE_TYPE = 'OBJECT_TYPE' AND
lc.CODE = 'PORTFOLIOS'
WHERE lc.LKU_CODE_ID = core_objects.OBJECT_TYPE_ID) AND object_id = 83
) "co"
ON (ua.CORE_OBJECT_ID = "co".CORE_OBJECT_ID AND USER_ID = 24 AND SECTION = 1)
WHEN MATCHED THEN UPDATE
SET create_date = sysdate, created_by = '24', capabilities = 12
WHERE capabilities <> 12
WHEN NOT MATCHED THEN INSERT
(CAPABILITIES, CORE_OBJECT_ID, CREATE_DATE, CREATED_BY, SECTION, USER_ID)
VALUES (5, "co".CORE_OBJECT_ID, sysdate, '24', 1, 24);
需要注意的重要一点是我正在尝试使用 USING 返回的值,所以我必须给它起别名 and .values()
必须接受一个现场通话。我想我可以使用 .values(Collection<?>)
调用来解决 .values()
问题,将包括该字段在内的东西捆绑到一个集合中,所以我认为我有那个部分。让我担心的是我无法在 .using()
之后进行 .as()
调用。如果我通过 .asTable()
使 USING
查询成为 "table",并提供一个别名,我可以调用该字段吗?这是我目前拥有的:
Table<Record1<BigDecimal>> usingStatement = readContext
.select(_co.CORE_OBJECT_ID)
.from(_co)
.where(DSL.exists(readContext.select(_lc.fields()).from(
_lc.join(_lct).onKey(Keys.LC_LCT___FK)
.and(_lc.CODE.equal(capability.getObjectTypeCode()))
.and(_lct.CODE_TYPE.equal(LkuCodeTypeLookup.OBJECT_TYPE))))).asTable("sdf");
...
return writeContext
.mergeInto(_ua)
.using(usingStatement)
.on(sectionalConditions.and(_ua.CORE_OBJECT_ID.equal(coidField)))
.whenMatchedThenUpdate()
.set(_ua.CREATE_DATE, time)
.set(_ua.CREATED_BY, creator)
.set(_ua.CAPABILITIES, capabilities)
.where(_ua.CAPABILITIES.notEqual(capabilities))
.whenNotMatchedThenInsert(_ua.CAPABILITIES, _ua.CORE_OBJECT_ID, _ua.CREATE_DATE,
_ua.CREATED_BY, _ua.SECTION, _ua.USER_ID)
.values(capabilities, gcoid, time, creator, section, uuid).execute();
A "straight merge" 在 jOOq 中使用 dual 很简单,但我想尝试将 select 合并到合并中以保存查询并让数据库做它最擅长的事情,所以如果可能的话,我尽量不必在另一个查询中得到 core_object_id。
别名确实发生在 table(即 select)上,而不是在 USING
子句返回的某些人工制品上。至少,jOOQ 是这样建模的。您已经正确地为 usingStatement
变量设置了别名。现在您所要做的就是从中取消引用所需的列,例如:
usingStatement.field(_co.CORE_OBJECT_ID);
这将在 usingStatement
table 中查找名为 CORE_OBJECT_ID
的列。
感觉我已经很接近了,但是我不知道如何在 jOOq 中做类似下面的事情。
MERGE INTO USER_ASSIGNMENTS ua
USING (
SELECT core_object_id
FROM core_objects
WHERE exists(SELECT *
FROM LKU_CODE lc JOIN LKU_CODE_TYPE lct
ON lc.LKU_CODE_TYPE_ID = lct.LKU_CODE_TYPE_ID AND lct.CODE_TYPE = 'OBJECT_TYPE' AND
lc.CODE = 'PORTFOLIOS'
WHERE lc.LKU_CODE_ID = core_objects.OBJECT_TYPE_ID) AND object_id = 83
) "co"
ON (ua.CORE_OBJECT_ID = "co".CORE_OBJECT_ID AND USER_ID = 24 AND SECTION = 1)
WHEN MATCHED THEN UPDATE
SET create_date = sysdate, created_by = '24', capabilities = 12
WHERE capabilities <> 12
WHEN NOT MATCHED THEN INSERT
(CAPABILITIES, CORE_OBJECT_ID, CREATE_DATE, CREATED_BY, SECTION, USER_ID)
VALUES (5, "co".CORE_OBJECT_ID, sysdate, '24', 1, 24);
需要注意的重要一点是我正在尝试使用 USING 返回的值,所以我必须给它起别名 and .values()
必须接受一个现场通话。我想我可以使用 .values(Collection<?>)
调用来解决 .values()
问题,将包括该字段在内的东西捆绑到一个集合中,所以我认为我有那个部分。让我担心的是我无法在 .using()
之后进行 .as()
调用。如果我通过 .asTable()
使 USING
查询成为 "table",并提供一个别名,我可以调用该字段吗?这是我目前拥有的:
Table<Record1<BigDecimal>> usingStatement = readContext
.select(_co.CORE_OBJECT_ID)
.from(_co)
.where(DSL.exists(readContext.select(_lc.fields()).from(
_lc.join(_lct).onKey(Keys.LC_LCT___FK)
.and(_lc.CODE.equal(capability.getObjectTypeCode()))
.and(_lct.CODE_TYPE.equal(LkuCodeTypeLookup.OBJECT_TYPE))))).asTable("sdf");
...
return writeContext
.mergeInto(_ua)
.using(usingStatement)
.on(sectionalConditions.and(_ua.CORE_OBJECT_ID.equal(coidField)))
.whenMatchedThenUpdate()
.set(_ua.CREATE_DATE, time)
.set(_ua.CREATED_BY, creator)
.set(_ua.CAPABILITIES, capabilities)
.where(_ua.CAPABILITIES.notEqual(capabilities))
.whenNotMatchedThenInsert(_ua.CAPABILITIES, _ua.CORE_OBJECT_ID, _ua.CREATE_DATE,
_ua.CREATED_BY, _ua.SECTION, _ua.USER_ID)
.values(capabilities, gcoid, time, creator, section, uuid).execute();
A "straight merge" 在 jOOq 中使用 dual 很简单,但我想尝试将 select 合并到合并中以保存查询并让数据库做它最擅长的事情,所以如果可能的话,我尽量不必在另一个查询中得到 core_object_id。
别名确实发生在 table(即 select)上,而不是在 USING
子句返回的某些人工制品上。至少,jOOQ 是这样建模的。您已经正确地为 usingStatement
变量设置了别名。现在您所要做的就是从中取消引用所需的列,例如:
usingStatement.field(_co.CORE_OBJECT_ID);
这将在 usingStatement
table 中查找名为 CORE_OBJECT_ID
的列。