2016-05-08 13 views
0

ich ein Schema in SQLite 3 haben, die wie folgt aussieht:Ärger mit voller schließt sich in SQLite3

CREATE TABLE tags(id INTEGER PRIMARY KEY, tag TEXT NOT NULL, UNIQUE(tag)); 
CREATE TABLE files(id INTEGER PRIMARY KEY, name TEXT NOT NULL, UNIQUE(name)); 
CREATE TABLE filetags(file_id INT NOT NULL, tag_id INT NOT NULL, UNIQUE(file_id, tag_id), FOREIGN KEY(file_id) REFERENCES files(id), FOREIGN KEY(tag_id) REFERENCES tags(id)); 

Ich habe versucht, eine Abfrage zu schreiben, die für eine bestimmte Datei-ID, jeden einzelnen Tag zeigt und wenn dieses Tag für diese ID gesetzt ist. Die nächstgelegene ich bekommen kann, ist so etwas wie die folgende:

SELECT * FROM tags t 
LEFT OUTER JOIN filetags ft ON ft.tag_id=t.id 
LEFT OUTER JOIN files f ON f.id=ft.file_id WHERE [email protected] OR 
f.id IS NULL 

, die für eine Datei arbeiten, die mit 1 oder mehr Tag hat, aber für eine Datei ohne Tags, es schließt alle Tags, die mindestens eine Datei . Ich habe verschiedene Varianten davon ausprobiert, aber scheint begrenzt zu sein, indem ich sqlite's Mangel an vollen und richtigen Joins umgehen musste.

+0

vielleicht nützlich? http://stackoverflow.com/questions/1923259/full-outer-join-with-sqlite –

Antwort

1

mit dem Begriff starten: „Ich alle Dateien wollen und alle Tags“:

SELECT * FROM files f CROSS JOIN tags t 

Jetzt müssen Sie anhängen „ob diese Datei tatsächlich das Tag-Set“:

SELECT * FROM files f CROSS JOIN tags t 
    LEFT JOIN filetags ft ON ft.file_id=f.id AND ft.tag_id=t.id 

Und für ein bisschen Polnisch, ein kosmetischer Alias ​​dafür: