我在使用 SQLite 和 JDBC 时遇到一些奇怪的结果(实际上是通过 JOOQ,但可以通过 JDBC 手动执行查询字符串来重现此问题)。我的数据库由三个表组成,包括多对多和一对多关系。我尝试选择“主”表的所有值,并将所有需要的值从关系表中连接出来:
SELECT location.name,
world.world,
player.player
FROM location
JOIN world
ON location."world-id" = world."world-id"
LEFT OUTER JOIN (location2player
JOIN player
ON location2player."player-id" = player."player-id")
ON location."location-id" = location2player."location-id"
在 JDBC 中此查询失败:
java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (no such column: player.player)
当我在外部 SQLite 编辑器(例如适用于 Firefox 的 SQLite Manager)中执行查询时,它会按预期工作。
我使用sqlite-jdbc-3.7.2
,我无法更改它。作为引用,JOOQ 查询为:
create.select(LOCATION.NAME,WORLD.WORLD_,PLAYER.PLAYER_)
.from(LOCATION
.join(WORLD)
.on(LOCATION.WORLD_ID.eq(WORLD.WORLD_ID)
)
.leftOuterJoin(LOCATION2PLAYER
.join(PLAYER)
.onKey()
)
.on(LOCATION.LOCATION_ID.eq(LOCATION2PLAYER.LOCATION_ID)
)
.fetch()
为什么在 JDBC 中此查询失败以及我应该如何修复它?
最佳答案
虽然我认为您编写了有效的 ANSI SQL,但 SQLite 对您的语句的解释很可能略有不同。但您实际上并不需要像您那样进行嵌套连接。试试这个安装:
SELECT location.name,
world.world,
player.player
FROM location
JOIN world
ON location."world-id" = world."world-id"
LEFT OUTER JOIN location2player
ON location."location-id" = location2player."location-id"
LEFT OUTER JOIN player
ON location2player."player-id" = player."player-id"
关于java - SQLite 无法通过 JDBC 和 jOOQ 在 SELECT 中找到现有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23964972/