2016-04-04 9 views
1

Ist es möglich, eine Aussage in sqlite.swift zu schreiben, die die entsprechenden SQL generieren:, wie aus mehreren Tabellen in sqlite.swift abzufragen

SELECT foods.name, food_types.name aus Lebensmitteln, food_types WHERE Lebensmittel .type_id = food_types.id LIMIT 10;

Ich kann nicht herausfinden, wie man von mehreren Tischobjekten gleichzeitig abfragt. Danke!

Antwort

2

Ihre ursprüngliche Abfrage übergibt zwei Tabellen an die FROM-Klausel, wodurch eine implizite Verknüpfung erstellt wird. SQLite.swifts Abfrage-Builder-Sprache unterstützt derzeit nur explizite Joins.

Weitere Informationen zum Verknüpfen von Tabellen finden Sie in der Dokumentation unter Joining Other Tables.

In Ihrem Fall:

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) 
+0

Dank Stephen, ich habe es ausprobiert und es funktioniert, ich renne in Schwierigkeiten, wenn ich versuche, mehr als zwei Tabellen, ich habe mehrere Tabellen alle mit dem gleichen Fremdschlüssel und ich versuche, daran teilzunehmen aber ich bekomme nicht das erwartete Ergebnis, ich bekomme viel mehr Zeilen als erwartet. Ich kann zwei gleichzeitig machen und dann meine Datenstruktur von dort aus aufbauen, aber ich suchte nach etwas Eleganterem. Ich schätze deine Arbeit und dein gut entworfenes Sqlite.swift sehr. Prost. – docho

+0

Ohne ein Beispiel von dem, was nicht funktioniert, habe ich leider nicht die Fähigkeit, weiter zu helfen :('.join' s kann angekettet werden, so dass Sie in der Lage sein sollten, komplexere Joins aufzubauen. – stephencelis

+0

Danke für Ich denke, dass ich es herausgefunden habe.Der Fremdschlüssel ist eine Spalte für alle Tabellen, denen ich beitreten möchte, aber es gibt Fremdschlüsselelemente, die unter allen Tabellen nicht üblich sind, daher glaube ich, dass SQL dann aa generiert cross join vs ein inner join ... Das führt zu allen zusätzlichen Zeilen in der Abfrage.Ich bestätigte dies mit dem SQL, das sqlite.swift direkt auf der db generiert.Danke nochmal und ich schließe die Frage – docho

0

ich es herausgefunden. Der Fremdschlüssel ist eine Spalte für alle Tabellen, denen ich beitreten möchte, aber es gibt Fremdschlüsselelemente, die unter allen Tabellen nicht üblich sind, daher glaube ich, dass SQL dann eine Kreuzverbindung gegen eine Innenverbindung erzeugt ... Das führt zu alle zusätzlichen Zeilen in der Abfrage. Ich habe dies bestätigt, indem ich die SQL verwendet habe, die sqlite.swift direkt auf der Datenbank generiert.