Consider for example the following tables. An underline column name means that it's part of the primary key for its table, and foreign keys reference the primary key of the table they were named after.
-- Load the first 5 maps for every gameSELECT *
FROM GAME JOIN MAP ON GAME.devStudio = MAP.devStudio
WHERE MAP.position >= 0 AND MAP.position <= 5
Initial attempt:
let game = DomainModel.game
let map = DomainModel.map
let firstFiveMapsForEachGameQuery = game.table.join(
map.table,
on: game.devStudioColumn == map.devStudioColumn
).filter(
map.positionColumn >= 0 && map.positionColumn <= 5
)
let results = try dbConnection.prepare(firstFiveMapsForEachGameQuery)
for map in results {
// TODO: Process query results.
}
In the context of the above code snippet, game.devStudioColumn = Expression<String>("devStudio") and map.devStudioColumn = Expression<String>("devStudio"), but of course it refers to different columns for different tables. When I run the above code I get the following fatal error:
Sqlite : ambiguous column name
Failed solution attempt:
Predictably, in SQL you would solve this issue via the following syntax: GAME.devStudio, MAP.devStudio, or assigning an alias to it.
In SQLite.Swift, I tried changing game.devStudioColumn to Expression<String>("\(game.tableName).devStudio") and the same for map.devStudioColumn. The generated template for it, though, is "GAME.devStudio" and "MAP.devStudio", all enclosed in double quotes, which causes
Syntax error near ', no such column: GAME.devStudio
Context:
Consider for example the following tables. An underline column name means that it's part of the primary key for its table, and foreign keys reference the primary key of the table they were named after.
DEV_STUDIO(name, position) GAME(name, devStudio, position) FK(devStudio) REF DEV_STUDIO(name) MAP(name, game, devStudio, position) FK(game, devStudio) REF GAME(name, devStudio)
Now suppose I want to run this query:
-- Load the first 5 maps for every game SELECT * FROM GAME JOIN MAP ON GAME.devStudio = MAP.devStudio WHERE MAP.position >= 0 AND MAP.position <= 5
Initial attempt:
In the context of the above code snippet,
game.devStudioColumn = Expression<String>("devStudio")
andmap.devStudioColumn = Expression<String>("devStudio")
, but of course it refers to different columns for different tables. When I run the above code I get the following fatal error:Failed solution attempt:
Predictably, in SQL you would solve this issue via the following syntax:
GAME.devStudio
,MAP.devStudio
, or assigning an alias to it.In SQLite.Swift, I tried changing
game.devStudioColumn
toExpression<String>("\(game.tableName).devStudio")
and the same formap.devStudioColumn
. The generated template for it, though, is "GAME.devStudio" and "MAP.devStudio", all enclosed in double quotes, which causesSo what's the way to go here?