[sqlite] doppelte Bedingung in select sparen



  • Hallo,
    ich habe folgende Tabelle:

    CREATE TABLE tSubjects (
      id INTEGER PRIMARY KEY ASC AUTOINCREMENT,
      name TEXT,
      lft INTEGER,
      rgt INTEGER);
    

    Nun möchte ich folgende SELECT-Anweisung verbessern:

    SELECT * FROM tSubjects WHERE lft IN (2,3,4) OR rgt IN (2,3,4);
    

    Wie kann ich die doppelte IN Bedingung vermeiden? (die Zahlen in IN() sind in der betreffenden Abfrage immer die selben)

    MfG
    Gartenzwerg



  • Soweit ich weiss gar nicht.

    p.S.: zumindest nicht sinnvoll. Eine Möglichkeit die IN () Liste nur 1x schreiben zu müssen gibt es ziemlich sicher, nur wird das Statement dadurch vermutlich grösser, komplizierter und vor allem langsamer.

    Beispiel für wie es vermutlich ginge (ich kann nicht garantieren ob SQLite das so frisst, aber soll ja nur als Beispiel dienen warum ich es gar nicht erst versuchen würde):

    SELECT * FROM tSubjects WHERE id IN (
        SELECT DISTINCT foo.id FROM (
            SELECT id, lft AS x FROM tSubjects
            UNION ALL
            SELECT id, rgt AS x FROM tSubjects
        ) AS foo
        WHERE foo.x IN (2, 3, 4)
    )
    

    -> würde ich schon alleine deswegen nicht machen, weil es unnötig kompliziert ist, und wie gesagt, vermutlich auch unnötig langsam.



  • Vielen Dank für die Antwort.
    Du hast recht, deine Lösung nimmt SQLite zwar an, jedoch braucht es deutlich länger für die Ausführung. (CPU Time: user 0.080001 sys 0.000000 gegenüber CPU Time: user 0.000001 sys 0.000000)
    Da die IN() Listen aus meinem Statement ebenfalls mit einer (recht einfachen) SELECT-Anweisung gefüllt werden, hatte ich gehofft, eine doppelte Abfrage zu umgehen.
    Aber doppelt ist offensichtlich einfacher zu verstehen (=> weniger fehleranfällig) und in diesem Fall auch schneller.

    MfG
    Gartenzwerg


Log in to reply