SQLite Abfrage mit Fremdschlüsseln

  • Antworten:3
  • Bentwortet
Col.Biernot
  • Forum-Beiträge: 30

17.11.2015, 10:02:54 via Website

Hallo,
Ich habe 3 Tabellen. Eine Haupttabelle "Listelement" und zwei Nebentabellen, "Rooms" und "Locations". Die ID's der Räume und Standorte habe Ich als Fremdschlüssel in meine Haupttabelle eingetragen. Jetzt möchte Ich alle Raumnamen ausgegeben haben die in einem bestimmten Standord sind. Wie mache Ich das am geschicktesten. Eine dreifachverkettung wie

(select rname from rooms where (select fkrid fromeintrag where (select lid from location USW.)))

scheint mir wenig sinnvoll. Wie regle Ich das am besten?

MfG
Col. Biernot

Im Anhang meine Tabelle:

    public static final String DB_NAME = "DAAInv.db";
public static final int DB_VERSION = 1;
//LISTELEMENT TABLE
public static final String TABLE_LISTELEMENT = "listelement";
public static final String COL_LEID = "leid";
public static final String COL_PRODUCT = "product";
public static final String COL_LABEL = "label";
public static final String COL_SERIAL = "serial";
public static final String COL_MAC = "mac";
public static final String COL_DAAID = "daaid";
public static final String COL_BILL = "bill";
public static final String COL_FK_LID = "fklid";
public static final String COL_FK_RID = "fkrid";
//ROOM TABLE
public static final String TABLE_ROOM = "room";
public static final String COL_RID = "rid";
public static final String COL_RNAME = "roomname";
//LOCATION TABLE
public static final String TABLE_LOCATION = "location";
public static final String COL_LID = "lid";
public static final String COL_LOCNAME = "locationname";


public static final String SQL_CREATE_LE =
        "create table " + TABLE_LISTELEMENT + "(" +
                COL_LEID + " integer primary key autoincrement, " +
                COL_PRODUCT + " text, " +
                COL_LABEL + " text UNIQUE ON CONFLICT REPLACE, " +
                COL_SERIAL + " text, " +
                COL_MAC + " text, " +
                COL_DAAID + " text, " +
                COL_BILL + " text, " +
                COL_FK_LID + " REFERENCES location(lid) ON DELETE RESTRICT, " +
                COL_FK_RID + " REFERENCES room(rid) ON DELETE RESTRICT" + ")";

public static final String SQL_CREATE_R =
        "create table " + TABLE_ROOM + "(" +
                COL_RID + " integer primary key autoincrement, " +
                COL_RNAME + " UNIQUE ON CONFLICT REPLACE" + ")";

public static final String SQL_CREATE_LOC =
        "create table " + TABLE_LOCATION + "(" +
                COL_LID + " integer primary key autoincrement, " +
                COL_LOCNAME + " UNIQUE ON CONFLICT REPLACE" + ")";

Antworten
Col.Biernot
  • Forum-Beiträge: 30

17.11.2015, 11:07:55 via Website

Im Moment versuche Ich es mit :
SELECT roomname FROM room WHERE rid IS (SELECT fkrid FROM listelement WHERE fklid IS (SELECT lid FROM location WHERE locationname IS 'BI01'))

Aber das klappt nicht so recht...

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

17.11.2015, 11:22:27 via App

Achau dir mal SQL Joins an damit müsstest du das schaffen. Oder du machst nen multiselect über mehrere Tabellen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Col.Biernot
  • Forum-Beiträge: 30

17.11.2015, 12:18:56 via Website

Ich schaffe es einfach nicht -.- mein bestes Ergebnis bis jetzt ist:

SELECT roomname FROM room WHERE rid IS
(SELECT fkrid FROM listelement WHERE fklid IS
(SELECT lid FROM location WHERE locationname IS 'BI01'))

aber da bekomme Ich nur einen Wert raus

EDIT: Mein PRoblem mit den JOINS ist dass die Tabelle von der Ich den Raumnamen haben möchte nicht die Tabelle ist die Referenzen zu den beiden anderen enthält. das ist ja Listelement.

EDIT: Habs :D
SELECT r.roomname FROM listelement AS list
INNER JOIN room AS r ON list.fkrid = r.rid
INNER JOIN location AS loc ON list.fklid = loc.lid
WHERE loc.locationname IS 'BI03'

— geändert am 17.11.2015, 12:40:17

Antworten