как запрашивать из нескольких таблиц в sqlite.swift

Можно ли написать оператор в sqlite.swift, который будет генерировать эквивалентный sql:

ВЫБЕРИТЕ food.name, food_types.name FROM food, food_types WHERE food.type_id=food_types.id LIMIT 10;

Я не могу понять, как запрашивать сразу несколько объектов Table. Спасибо!


person docho    schedule 04.04.2016    source источник


Ответы (2)


Ваш исходный запрос передает две таблицы в предложение FROM, создавая неявное соединение. Язык построителя запросов SQLite.swift в настоящее время поддерживает только явные соединения.

Ознакомьтесь с документацией в разделе Соединение с другими таблицами для получения дополнительной информации о соединении таблиц.

В твоем случае:

let foods = Table("foods")
let food_types = Table("food_types")
let name = Expression<String>("name")
let id = Expression<Int64>("id")
let type_id = Expression<Int64>("type_id")

let query = foods
    .select(foods[name], food_types[name])
    .join(food_types, on: foods[type_id] == food_types[id])
    .limit(10)
person stephencelis    schedule 04.04.2016
comment
Спасибо, Стивен, я пробовал это, и это работает, у меня возникают проблемы, когда я пытаюсь присоединиться к более чем двум таблицам, у меня есть несколько таблиц с одним и тем же внешним ключом, и я пытаюсь присоединиться к нему, но я не не получаю ожидаемого результата, я получаю больше строк, чем ожидалось. Я могу сделать два за раз, а затем построить свою структуру данных оттуда, но я искал что-то более элегантное. Я очень ценю вашу работу и ваш хорошо разработанный Sqlite.swift. Ваше здоровье. - person docho; 05.04.2016
comment
Без примера того, что не работает, у меня, к сожалению, нет возможности помочь дальше :( .join могут быть объединены в цепочку, поэтому вы сможете продолжать создавать более сложные соединения. - person stephencelis; 05.04.2016
comment
Спасибо за продолжение, кажется, я разобрался. Внешний ключ - это столбец для всех таблиц, к которым я пытаюсь присоединиться, но есть члены внешнего ключа, которые не являются общими для всех таблиц, поэтому я считаю, что sql затем генерирует перекрестное соединение по сравнению с внутренним соединением... Это приводит к все лишние строки в запросе. Я подтвердил это, используя sql, который sqlite.swift генерирует непосредственно в базе данных. Еще раз спасибо, и я закрою вопрос - person docho; 05.04.2016
comment
@стефенселис. Я не уверен, что кто-либо во вселенной может ответить на этот вопрос, кроме вас: stackoverflow.com/questions/41874682/ !! Я в тупике. - person Fattie; 28.01.2017
comment
Так хорошо написано... спасибо! Я искал хороший пример того, как это сделать в течение нескольких месяцев, и всегда просто обходил его, и теперь это очень ясно. - person Jc Nolan; 11.08.2019

Я понял. Внешний ключ - это столбец для всех таблиц, к которым я пытаюсь присоединиться, но есть члены внешнего ключа, которые не являются общими для всех таблиц, поэтому я считаю, что sql затем генерирует перекрестное соединение по сравнению с внутренним соединением... Это приводит к все лишние строки в запросе. Я подтвердил это, используя sql, который sqlite.swift генерирует непосредственно в БД.

person docho    schedule 05.04.2016