【发布时间】:2020-09-20 16:16:26
【问题描述】:
所以我有五个表,我试图在一个查询中返回
parent_section(id, gate_id)
Assessment_Question(id,parent_section_id)
Assessment_question_multi_choice_option(id, question_id)
Assessment_answer_Group(id, entity_id)
Assessment_Answer(id,assessment_question_id, assessment_answer_Group_id)
我正在尝试列出所有问题
错误是Unknown column 'ideas_service.parent_section.id' in 'on clause'
这是我的查询
dsl.select()
.from(PARENT_SECTION,ASSESSMENT_ANSWER_GROUP)
.join(ASSESSMENT_QUESTION)
.on(PARENT_SECTION.ID.eq(ASSESSMENT_QUESTION.PARENT_SECTION_ID))
.leftJoin(ASSESSMENT_QUESTION_MULTI_CHOICE_OPTION)
.on(
ASSESSMENT_QUESTION_MULTI_CHOICE_OPTION.ASSESSMENT_QUESTION_ID.eq(
ASSESSMENT_QUESTION.ID))
.join(ASSESSMENT_ANSWER)
.on(ASSESSMENT_ANSWER_GROUP.ID.eq(ASSESSMENT_ANSWER.ASSESSMENT_ANSWER_GROUP_ID))
.where(PARENT_SECTION.GATE_ID.eq(gateId))
.fetch()
以前,当我只尝试查询表中的三个表时,parent_Section_assessment_question 和assessment_question_multi_choice,我的查询是这样的,并且有效
var queryResult =
dsl.select()
.from(PARENT_SECTION)
.join(ASSESSMENT_QUESTION)
.on(PARENT_SECTION.ID.eq(ASSESSMENT_QUESTION.PARENT_SECTION_ID))
.leftJoin(ASSESSMENT_QUESTION_MULTI_CHOICE_OPTION)
.on(
ASSESSMENT_QUESTION_MULTI_CHOICE_OPTION.ASSESSMENT_QUESTION_ID.eq(
ASSESSMENT_QUESTION.ID))
.where(PARENT_SECTION.GATE_ID.eq(gateId))
.fetch()
我应该如何修改工作查询以同时列出问题assessment_answer.answer_group_id 上的assessment_Answer_Group(whereassessment_answer_Group.entity_id = x) 之间的联接
澄清连接结构
我在 parent_section 和assessment_Question 之间进行内部联接,在assessment_question 和assessment_multi_choice_option 之间进行左联接
answer_group 和assessment_answer 之间的连接与这三个表是分开的,它应该是assessment_answer_group.entity_id = x 并在assessment_Answer.answer_Group_id =assessment_answer_Grorup.id 上连接
编辑:在 akinas cmets 我的查询现在是这样的,它找到了assessment_answer_group,但没有找到任何assessment_answers
var queryResult =
dsl.select()
//below line is cross join with an always true join coniditon
.from(PARENT_SECTION.join(ASSESSMENT_ANSWER_GROUP).on(true))
.join(ASSESSMENT_QUESTION)
.on(PARENT_SECTION.ID.eq(ASSESSMENT_QUESTION.PARENT_SECTION_ID))
.leftJoin(ASSESSMENT_QUESTION_MULTI_CHOICE_OPTION)
.on(
ASSESSMENT_QUESTION_MULTI_CHOICE_OPTION.ASSESSMENT_QUESTION_ID.eq(
ASSESSMENT_QUESTION.ID))
.join(ASSESSMENT_ANSWER)
.on(ASSESSMENT_ANSWER_GROUP.ID.eq(ASSESSMENT_ANSWER.ASSESSMENT_ANSWER_GROUP_ID))
.where(PARENT_SECTION.GATE_ID.eq(gateId))
【问题讨论】:
-
看来
.from(PARENT_SECTION,ASSESSMENT_ANSWER_GROUP)不等于.from(PARENT_SECTION).join(ASSESSMENT_ANSWER_GROUP)——笛卡尔可能会得到一些未知的中间名,所以PARENT_SECTION表名别名失效。如果每个.join都需要自己的.on,那么试试.from(PARENT_SECTION).join(ASSESSMENT_ANSWER_GROUP).on(1)。 -
所以我不想加入 parent_section 和assessment_answer_group,我编辑了 OP 看看是否能澄清事情
-
我不想加入 parent_section 和assessment_answer_group 在 MySQL 语法中(您已将问题标记为 MySQL-relative),表名之间的逗号表示这些的低优先级 CROSS JOIN表。所以在
t1, t2 join t3中首先进行t2和t3的连接,这个连接不能访问t1列,因为t1还没有连接。 -
啊,我想我当时错误地使用了 JOOQ。我不打算交叉加入这两个表,我认为 Select(TABLE1, TABLE2) 只是说从这两个表中选择
-
我认为 Select(TABLE1, TABLE2) 只是说从这两个表中选择这是真的。在 MySQL 中,
FROM t1,t2、FROM t1 CROSS JOIN t2、FROM t1 JOIN t2和FROM t1 INNER JOIN t2(最后两个 - 没有 ON 子句)是别名并导致从两个表中进行选择(而不是在其他 DBMS 中最后两个变体必须有ON子句)。逗号语法的唯一区别是它的优先级较低。