首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JOOQ中,右/左外连接有from()和and‘和’,有四个表

在JOOQ中,右/左外连接有from()和and‘和’,有四个表
EN

Stack Overflow用户
提问于 2017-08-10 09:49:44
回答 1查看 467关注 0票数 2

我是JOOQ的新手,需要帮助将SQL转换为JOOQ。我在这里有一个很长的SQL语句:

请看这张图以获得更好的洞察力:外连接

代码语言:javascript
复制
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语句翻译为:

代码语言:javascript
复制
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中,我有四个表,分别是deckagdvvsagvagd表必须与agd.agd_code(+) = deck.dec_agd_code上的deck表连接。我正确地翻译了sql吗?

  1. 如何处理vvsagv,因为这些表是在from()中的agd之后出现的?

我花了两天的时间思考这个问题,但我解决不了这个问题。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-11 06:30:47

1:1翻译你的原始查询

虽然我通常不建议使用废弃的Oracle风格的外部联接语法,但请注意,jOOQ确实通过Field.plus()支持它,因此您可以编写:

SQL

代码语言:javascript
复制
AND agd.agd_code(+) = deck.dec_agd_code

jOOQ

代码语言:javascript
复制
.and(agd.AGD_CODE.plus().eq(deck.DEC_AGD_CODE))

不要将表列表与ANSI联接混合

除此之外,这个问题更容易解释。您将“经典”表列表( FROM子句中的几个表)与ANSI联接混合在一起,这总是令人困惑的。使用jOOQ时,jOOQ将把ANSI表达式附加到表列表的最后一个表中。在您的例子中,这导致了以下FROM子句:

代码语言:javascript
复制
-- 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

代码语言:javascript
复制
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

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45610241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档