Tricky SQL-Abfrage

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Mika2828.

    Tricky SQL-Abfrage

    Guten Abend in die Runde,

    ich würde heute gerne mal wieder meinem Usernamen alle Ehre machen und Euch mit einem SQL-Problem behelligen ;)

    Es geht um die folgende Tabelle

    id type status
    1 1 1
    2 1 1
    3 2 0
    4 2 1
    5 1 0
    6 3 1
    7 2 1
    8 1 1

    Die Abfrage soll die ersten drei id's liefern, bei denen der status=1 und type gleich ist. Hier wäre es also id 1, 2 und 8. type ist vorab nicht bekannt.

    Unelegant würde ich zuerst type mit Limit 1 abfragen, bei der status=1 hat und dann eine zweite Anfrage hinterherschicken, in die die ermittelte type integriert ist.

    Das geht doch aber sicher eleganter, oder?
    Allen, die sich des Problems annehmen möchten, sag ich schon mal DANKE


    Gruß thomas
    Mit LINQ wäre es

    VB.NET-Quellcode

    1. Dim MatchingEntries = Entries.Where(Function(x) x.Status = 1).GroupBy(Function(x) x.Type).FirstOrDefault(Function(x) x.Count > 2)?.Select(Function(x) x)

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Aus dem Bauch und ungetestet evtl. so.

    Select Top(3) from yourtable where status = 1 and status = type
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich verstand, dass status 1 sein soll, aber type von den Ergebnissen gleich sein soll. Also unabhängig davon, welchen Wert status hat. Also sollen die 3 Einträge rauskommen, bei denen type gleich ist (egal, ob alle 0 oder 1 oder 2 oder sonstewas haben) und status 1.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dann sind wir uns ja einig.
    Bilder
    • Result.png

      38,02 kB, 1.108×294, 99 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    vielfrager schrieb:

    Mission impossible?
    Jo, glaub auch impossible.
    Vielleicht kann man auch ein mehrzeiliges Sql-Script mit einem Command absetzen.
    Dann könnte man iwas in eine TempTable einlesen, und von der TempTable dann das Ergebnis abfragen (und dann die TempTable löschen)
    Das entspräche (wenns überhaupt geht) in etwa einer StoredProcedure, nur ohne Stored Procedure.
    Moin,

    mal eine kreative Lösung mit einer Common Table Expression (spart, je nach Datenbank, einen Table/Index Scan gegenüber zwei separaten Queries):

    SQL-Abfrage

    1. with cte as (
    2. select *
    3. from mytable
    4. where status = 1
    5. order by type, id
    6. )
    7. select *
    8. from cte
    9. where type = (select type from cte limit 1)
    10. limit 3;

    Mit freundlichen Grüßen,
    Thunderbolt
    @Kasi: Jetzt Du auch noch. Type kann einen beliebigen Wert haben. Es geht darum, die ersten 3 Einträge rauszufischen, die den gleichen type-Wert haben. Aber welcher Wert das ist, ist egal!
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Es soll aber beim Ausführen unbekannt sein, welchen Wert type hat. Nur Status ist mit 1 bekannt / fest vorgegeben. Wenn also 3 Einträge mit status = 1 und type-Wert 33 zuerst gefunden werden, sollen diese zurückgegeben werden. Wenn es aber vorher 3 Einträge gibt, die status = 1 und den type-Wert 42 haben, dann die.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    vielfrager schrieb:

    Offensichtlich wirklich eine mission impossible.


    wieso? Zur Not zieh' alle Daten aus der Datenbanktabelle per SQL in eine temporäre DataTable und ab da holst du dir das gewünschte Ergebnis per LINQ, wie bereits beschrieben.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Guten Abend,

    folgender Query gibt das gewünschte Ergebnis zurück.

    SQL-Abfrage

    1. SELECT id, type, status FROM docs d Where status = 1 AND (SELECT count(*) FROM docs WHERE status = 1 AND type = d.type GROUP BY type) > 2


    Für mich allerdings noch nicht 100% klar:
    Bei folgenden Daten:

    id type status
    1 1 1
    2 1 1
    3 2 1
    4 2 1
    5 1 0
    6 2 0
    7 2 1
    8 1 1

    Soll nun die id 1,2,8 zurück gegeben werden oder aber 3,4,7 ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mika2828“ ()