Я новичок в JOOQ.
У меня возникли проблемы с поиском в документации по учебнику или документации, какой из нескольких классов использовать при использовании оператора выбора DSLContext.
Синтаксис выбора не прав, потому что, я считаю, предложение where содержит ссылку на таблицу ifd, которая не находится внутри, а не в соединении. Я не уверен, как выполнить правильный синтаксис.
Любые источники документов были бы восприимчивы, а также указатели на то, что я делаю неправильно.
Descriptor d = DESCRIPTOR.as("d");
Desclink dl = DESCLINK.as("dl");
Ifdesc ifd = IFDESC.as("ifd");
//
Result<Record2<Integer, Integer>> result =
dslContext.select(d.NETWORKID, dl.PARENT)
.from(d)
.join(dl).on(dl.PARENT.equal(d.DESCID))
.where(ifd.DESCID.equal(dl.CHILD))
.fetch()
;
for (Record2 r2 : result) {
Integer n = r2.getValue( d.NETWORKID);
Integer p = r2.getValue(dl.PARENT);
logger.println("nwid : " + n + " p " + p );
}
Я думаю, что все, что вам не хватает, это просто еще одно соединение:
dslContext.select(ifd.IPADDRESS, d.NETWORKID, dl.PARENT)
.from(d)
.join(dl).on(dl.PARENT.equal(d.DESCID))
.join(ifd).on(dl.CHILD.equal(ifd.DESCID)) // another join here
.fetch();
Обратите внимание: вы можете объединить столько таблиц, сколько хотите, чтобы создать собственное "табличное выражение" для размещения предложения FROM
в SQL. Если вы присоединитесь к трем таблицам:
A join B on ...
join C on ...
То, что вы действительно делаете, это (псевдо-SQL):
T := A' join C on ...
A' := A join B on ...
Итак, лучший способ прочитать вышеприведенное "тройное соединение":
SELECT ...
FROM ((A join B on ...) join C on ...)
API jOOQ также поддерживает вложение таких выражений JOIN
изначально при использовании Table.join()
. Например:
( A.join(B).on(...) ).join(C).on(...)
// A' --> ^^^^^^^^^^^^^^^^^^^^^
// T --> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Метод SelectJoinStep.join()
который вы используете, является простым удобством для приведенного выше Table.join()
Это может быть интересно прочитать для вас, объясняя 1-2 синтаксические вещи в SQL.
Я смог обойти вышеуказанный код без использования явных команд соединения.
Код ниже добавляет еще одно возвращаемое значение, String.
Result<Record3<String, Integer, Integer>> result =
dslContext.select(ifd.IPADDRESS, d.NETWORKID, dl.PARENT)
.from(d, dl, ifd)
.where(
(ifd.DESCID.equal(dl.CHILD))
.and(dl.PARENT.equal(d.DESCID))
.and(ifd.IFWASPINGED.isTrue() )
)
.fetch()
;
for (Record3 r2 : result) {
Integer n = r2.getValue( d.NETWORKID);
Integer p = r2.getValue(dl.PARENT);
String ip = r2.getValue(ifd.IPADDRESS);
logger.println("nwid : " + n + " p " + p + " " + ip );
}
Меня все равно интересовало бы, как это будет выглядеть с помощью JOIN.