Hilfe bei SQL Abfrage

  • VB.NET
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Thisoft.

    Hilfe bei SQL Abfrage

    Hallo,

    ich habe folgende Tabelle (siehe Bild im Anhang).

    Mein Ziel ist, Folgendes abzufragen:

    - alle Datensätze, wo COSTCENTER_ID=10
    - alle Datensätze, wo COSTCENTER_ID=-1 und COSTTYPE_ID ungleich COSTTYPE_ID, wo COSTCENTER_ID=10

    Folgende Abfrage gibt mir das richtige Ergebnis:

    Quellcode

    1. select
    2. fix,
    3. var,
    4. costtype_id,
    5. costcenter_id
    6. from fixvar
    7. where costcenter_id=10
    8. union
    9. select
    10. fix,
    11. var,
    12. costtype_id,
    13. costcenter_id
    14. from fixvar
    15. where costcenter_id=-1 and costtype_id not in (select costtype_id from fixvar where costcenter_id=10)


    Allerdings bräuchte ich eine Lösung ohne Subquery. Wie stelle ich das an?

    Die Datenbank ist Firebird, aber ich denke, hier geht es eher um SQL im Allgemeinen.

    Danke.
    Bilder
    • image.png

      13 kB, 654×230, 150 mal angesehen
    mach es einfach so:

    SQL-Abfrage

    1. select fix, var, costtype_id, costcenter_id
    2. from fixvar
    3. where ( costcenter_id=10
    4. or (costcenter_id = -1 and costcenter_id <> 10))


    Müsste das selbe Ergebnis sein.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Einspruch @fichz - deine Variante liefert definitiv nicht das Ergebnis was der TE mit der Subquery erreicht.
    Er möchte alle Datensätze ausgeschlossen haben bei denen die costtype_id nicht mit den costtype_id's die in costcenter_id = 10 vorkommen übereinstimmt. Du schließt nur die aus bei denen costcenter_id = 10 ist.

    Thisoft schrieb:

    Warum willst oder kannst Du denn keine Subquery verwenden?


    Weil ich eine andere Tabelle habe, zu der ich das Ergebnis joinen möchte. Und dabei ist COSTCENTER_ID variabel, sprich, es kommt aus dieser anderen Tabelle.

    Also ich habe diese Haupttabelle (siehe Bild im Anhang); z. Z. habe ich die Daten nur für ein COSTCENTER_ID selektiert. Und zu dieser Tabelle möchte ich die FIX und VAR Felder joinen, etwa so:

    Quellcode

    1. select
    2. planningitems.costtype_id,
    3. costcentercode_id,
    4. fv.fix,
    5. fv.var
    6. from
    7. planningitems
    8. left join
    9. (select
    10. fix,
    11. var,
    12. costtype_id,
    13. costcenter_id
    14. from fixvar
    15. where
    16. costcenter_id=10 or (costcenter_id=-1 and costtype_id not in (select costtype_id from fixvar where costcenter_id=10))
    17. ) as fv on fv.costtype_id=planningitems.costtype_id
    18. where
    19. planningitems.costcentercode_id=10 and fakerow=0


    Die letzte Bedingung (die mit FAKEROW) ist jetzt uninteressant, damit habe ich nur die Daten aus der PLANNINGITEMS Tabelle gefiltert.

    Mit der obigen Abfrage habe ich nur das Problem, dass ich überall, wo COSTCENTER_ID=10 steht, sowas gerne hätte, wie COSTCENTER_ID=PLANNINGITEMS.COSTCENTERCODE_ID.

    Also ich möchte auf ein Feld ausserhalb der Subquery zugreifen.

    Wie wäre das möglich?
    Bilder
    • image.png

      2,24 kB, 209×139, 271 mal angesehen