MSSQL: Verknüpfung zwei Tabellen



  • Hallo zusammen,

    ich arbeite gerade mit der MSSQL Datenbank und habe ein kleines Problem:
    Ich möchte mir den Auftrag der mehrere Positionen hat anzeigen, bekomme jedoch als Ergebnis vier Datensätze angezeigt.

    select a.angebot 
    from angebot a, angebotpos ap 
    where a.angebot = 'E-10025' 
    and ap.angebot = a.angebot;
    

    Ergebnis bei MSSQL: 4 Datensätze
    Ergebnis bei Oracle: 1 Datensatz

    Ich könnte natürlich auch top 1 angeben, kann mir aber nicht vorstellen, dass das die ideale Lösung ist.
    Eine weitere Möglichkeit wäre mit verschachtelten SQLs zu arbeiten, dass verschlechtert aber die Lesbarkeit und die Skalierbarkeit des SQLs.

    Ich habe mehrere Jahre mit der Oracle-Datenbank gearbeitet und wundere mich jetzt, dass die Unterschied MSSQL zu Oracle so enorm ist.

    Hat jemand einen Vorschlag wie ich generell das Problem umgehen kann?



  • Ich verstehe deine Beschreibung nicht.

    MSSQL macht hier genau das was Du willst.

    Alle Datensätze wo a.angebot gleich 'E-10025' und ap.angebot gleich a.angebot ist

    Ob das so ist weiß ich nicht.
    MSSQL hat einen sehr guten Editor für die Datenbank.
    Da kannst Du dir sogar einen Query zusammenklicken. Da werden dann auch automatisch die Joins gemacht.



  • Schau dir mal die Daten in a.ANGEBOT an.



  • Hallo Unix-Tom,

    ich denke mein Problem liegt darin, dass ich Apfel mit Birnen vergleiche.

    Etwas ausführlicher:

    select * from angebot
    where angebot = 'E-10025';
    Ergebnis: 1 Datensatz
    
    select * from angebotpos
    where angebot = 'E-10025';
    Ergebnis: 4 Datensätze
    

    MSSQL:

    select a.angebot 
    from angebot a, angebotpos ap 
    where a.angebot = 'E-10025' 
    and ap.angebot = a.angebot;
    Ergebnis: 4 Datensätze
    

    Oracle:

    select a.angebot 
    from angebot a, angebotpos ap 
    where a.angebot = 'E-10025' 
    and ap.angebot = a.angebot;
    Ergebnis: 1 Datensatz, weil ich die Datensätze explizit aus Tabelle a sehen möchte
    

    Oracle:

    select ap.angebot 
    from angebot a, angebotpos ap 
    where a.angebot = 'E-10025' 
    and ap.angebot = a.angebot;
    Ergebnis: 4 Datensätze, weil ich die Datensätze explizit aus Tabelle ap sehen möchte
    

    Mein Problem bei MSSQL kann ich folgendermaßen umgehen:

    MSSQL:

    select top 1 a.angebot 
    from angebot a, angebotpos ap 
    where a.angebot = 'E-10025' 
    and ap.angebot = a.angebot;
    Ergebnis: 1 Datensatz
    

    Mein Fazit: Obwohl ich in der MSSQL explizit sage, dass ich die Daten aus der Tabelle a sehen möchte (select a.angebot), in der physisch nur 1 Datensatz vorliegt, gibt mir MSSQL immer die gesamte, durch die joins ergebene Datenmenge zurück.



  • Hallo,

    für sowas gibt's LEFT & RIGHT JOIN

    LG



  • Hallo 12345,
    ja es gibt die wirklich! Jedoch löse ich damit nicht mein Problem.

    select a.* from angebot as a left outer join angebotpos as ap on
    a.angebot = ap.angebot
    where a.angebot = 'E-10025';
    Ergebnis: immer noch 4 Datensätze
    

    Hat jemand eine Idee?



  • Hi 12345,
    ich glaube du hast recht! So kriege ich nur einen Datensatz raus:

    select * 
    from auftragpos ap left outer join auftrag a on
    ap.auftrag = a.auftrag
    where a.angebot = 'E-10025';
    Ergebnis: 1 Datensatz
    

    Ich glaube ich fange jetzt langsam zu verstehen.


Anmelden zum Antworten