- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 JOOQ 的新手,需要帮助将 SQL 转换为 JOOQ。所以我在这里有这么长的 SQL 语句:
请查看此图片以获得更好的洞察力:Outer Join
SELECT SUM(DECODE(VVS.VVS_ZWS_ID, 47, DECK.DEC_BRUTTOPRAEMIE_100, DECK.DEC_BRUTTOPRAEMIE_FOLGE))
FROM deck, agd, vvs, agv
WHERE vvs.vvs_ver_nummer = verNummer
AND vvs.vvs_nummer = vvsNummer
AND agv.agv_code = vvs.vvs_agv_code
AND deck.dec_ver_nummer = vvs.vvs_ver_nummer
AND deck.dec_vvs_nummer = vvs.vvs_nummer
AND deck.dec_tbl_code = 'KH'
AND agd.agd_code(+) = deck.dec_agd_code
AND ( NVL(agv.agv_aenderungstyp, 'NULL') IN ('4', '5')
OR NVL(agd.agd_aenderungstyp, 'NULL') NOT IN ('4', '5');
我已经翻译了 SQL 语句:
create.select(sum(decode().when(vvs.VVS_ZWS_ID.eq(47),deck.DEC_BRUTTOPRAEMIE_100)
.otherwise(deck.DEC_BRUTTOPRAEMIE_FOLGE)))
.from(deck, vvs, agv)
.rightOuterJoin(agd)
.on(agd.AGD_CODE.eq(deck.DEC_AGD_CODE))
.where(vvs.VVS_VER_NUMMER.eq(verNummer))
.and(vvs.VVS_NUMMER.eq(vvsNummer))
.and(agv.AGV_CODE.eq(vvs.VVS_AGV_CODE))
.and(deck.DEC_VER_NUMMER.eq(vvs.VVS_VER_NUMMER))
.and(deck.DEC_VVS_NUMMER.eq(vvs.VVS_NUMMER))
.and(deck.DEC_TBL_CODE.eq("KH"))
.and(nvl(agv.AGV_AENDERUNGSTYP, "NULL")
.in("4", "5")
.or(nvl(agd.AGD_AENDERUNGSTYP, "NULL")
.notIn("4", "5")))
.fetch();
我的问题是:1、在SQL语句from
中我有四个表,分别是deck
、agd
、vvs
和agv
。agd
表必须在 agd.agd_code(+) = deck.dec_agd_code
上与 deck
表连接。我是否正确翻译了 sql?
2. 我应该如何处理 vvs
和 agv
,因为这些表位于 from()
中的 agd
之后?
想了两天还是解决不了。
谢谢!
最佳答案
虽然我通常不推荐使用已弃用的 Oracle 风格的外连接语法,但请注意 jOOQ 通过 Field.plus()
支持它。 ,所以你可以这样写:
SQL
AND agd.agd_code(+) = deck.dec_agd_code
jOOQ
.and(agd.AGD_CODE.plus().eq(deck.DEC_AGD_CODE))
除此之外,问题更容易解释。您将“经典”表列表(FROM
子句中的几个表)与 ANSI 连接混合在一起,这总是令人困惑。当您使用 jOOQ 执行此操作时,jOOQ 会将 ANSI 连接表达式附加到表列表的最后一个表。在您的情况下,这导致了以下 FROM
子句:
-- Parentheses added for illustration purposes
FROM deck, vvs, (agv RIGHT OUTER JOIN agd ON agd.AGD_CODE = deck.DEC_AGD_CODE)
在这种情况下,您可能需要的是LEFT OUTER JOIN
,这样您的查询可能就会变得正确。
但它仍然会令人困惑,所以无论如何,我强烈建议您先将查询迁移到所有 ANSI 连接:
SQL
SELECT SUM(DECODE(VVS.VVS_ZWS_ID,
47, DECK.DEC_BRUTTOPRAEMIE_100,
DECK.DEC_BRUTTOPRAEMIE_FOLGE))
FROM deck
JOIN vvs
ON deck.dec_ver_nummer = vvs.vvs_ver_nummer
AND deck.dec_vvs_nummer = vvs.vvs_nummer
JOIN agv
ON agv.agv_code = vvs.vvs_agv_code
LEFT JOIN agd
ON deck.dec_agd_code = agd.agd_code
WHERE vvs.vvs_ver_nummer = verNummer
AND vvs.vvs_nummer = vvsNummer
AND deck.dec_tbl_code = 'KH'
AND ( NVL(agv.agv_aenderungstyp, 'NULL') IN ('4', '5')
OR NVL(agd.agd_aenderungstyp, 'NULL') NOT IN ('4', '5'));
jOOQ
create.select(sum(decode().when(vvs.VVS_ZWS_ID.eq(47),deck.DEC_BRUTTOPRAEMIE_100)
.otherwise(deck.DEC_BRUTTOPRAEMIE_FOLGE)))
.from(deck)
.join(vvs)
.on(deck.DEC_VER_NUMMER.eq(vvs.VVS_VER_NUMMER))
.and(deck.DEC_VVS_NUMMER.eq(vvs.VVS_NUMMER))
.join(agv)
.on(agv.AGV_CODE.eq(vvs.VVS_AGV_CODE))
.leftOuterJoin(agd)
.on(agd.AGD_CODE.eq(deck.DEC_AGD_CODE))
.where(vvs.VVS_VER_NUMMER.eq(verNummer))
.and(vvs.VVS_NUMMER.eq(vvsNummer))
.and(deck.DEC_TBL_CODE.eq("KH"))
.and(nvl(agv.AGV_AENDERUNGSTYP, "NULL")
.in("4", "5")
.or(nvl(agd.AGD_AENDERUNGSTYP, "NULL")
.notIn("4", "5")))
.fetch();
关于java - 右/左外连接 from() 和许多 'and' 与 JOOQ 中的四个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45610241/
我知道除了知道什么是“最喜欢的编程卡通”之外,stackoverflow 会对我有所帮助:P 这是接受的答案: Bill Karwin 感谢大家的帮助(我想给你们加倍投票) 我的查询结果是这样的(这是
我查询了此查询,该查询将相关图像返回到评论 return $comments = \DB::table('comments')->select('comments.comment','com
如果没有任何地址(内部连接),我有以下 LINQ 返回零。我如何将其设为 Outer Join 然后仅 Take(1)? var results = query.Join(
我是一名优秀的程序员,十分优秀!