Announcement

Collapse
No announcement yet.

Joins & Co.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Joins & Co.

    Hallo!

    Angenommen, Tabelle 1 hat 1 Datensatz mit der gewünschten ID; Tabelle 2 jedoch 2 Datensätze:
    SELECT Feld1 FROM Tabelle1 LEFT OUTER JOIN Tabelle ON Tabelle1.ID = Tabelle2.ID

    Problem: Ich möchte jedoch nur einen Datensatz, also die Ergebnismenge was mir die erste Tabelle hergibt. Nun ist mir Inner Join, Left Join usw. bekannt. Dennoch suche ich nach einer eleganten Lösung, wie ich zu jener Datenmenge komme, was mir die erste Tabelle liefert. Das Problem ist, ich habe hier sehr viele SQL-Anweisungen (wirklich viele), mit teils vielen Tabellen, in der ich nicht immer mit eine Subselect effizient arbeiten kann (oder/und möchte). Daher suche ich nach einer einfachen Lösung, wie ich Daten aus unterschiedlichen Tabellen erhalte, ohne die Datenmenge, welche mir Tabelle1 liefert zu verändern.

    Klar, Tabelle2 hat 2 Datensätze, welchen nehmen? Diese Problematik ist auch mir bekannt. Hier möchte ich auch eine Selektionsmöglichkeit haben, z.B. Top 1, eine Order By-Klausel o.ä. Wie gesagt, eine elegante, einfache Lösung suche ich. Mir geht es nicht nur um "hauptsache es funktioniert", sondern es soll auch einfach umsetzbar und performanent sein.

    Vielen Dank für eure Ratschläge und Hinweise!

  • #2
    Ein Left-Join sollte doch genau das Ergebnis liefern

    Comment


    • #3
      Originally posted by Markus Kinzler View Post
      Ein Left-Join sollte doch genau das Ergebnis liefern
      Nein, leider nicht. Beispiel, Zitat aus meinem ersten Posting:
      Angenommen, Tabelle 1 hat 1 Datensatz mit der gewünschten ID; Tabelle 2 jedoch 2 Datensätze:
      SELECT Feld1 FROM Tabelle1 LEFT OUTER JOIN Tabelle ON Tabelle1.ID = Tabelle2.ID


      Mit einem Left join erhalte ich nur jene Datensätze bzw. Artikel, die mit der ID aus der Tabelle1 übereinstimmen. Jene IDs, die nicht in der der Tabelle mit dem Left Join sind, werden nicht angezeigt. Klar, dadurch wird die Datenmenge nicht erhöht.

      Hat jedoch die 2te Tabelle 2 Datensätze zu einer ID, erhalte ich am Ende auch 2 Datensätze. Das ist nicht gewollt und möchte ich vermeiden, ich möchte nur ein Datensatz. Klar, welcher von den beiden soll verwendet werden? Da müsste eine Selektierung in irgendeiner Form stattfinden.

      Nur: Wie stell ich das ganze Performancetechnisch am besten an? Und wie kann ich das ganze überhaupt erreichen?

      Es gibt zwar Umwege, nur sind sind 1. aufwendig und 2. schlecht für die Performance.

      Comment


      • #4
        drehs halt um:
        Code:
        SELECT Feld1 
        FROM Tabelle2 
        LEFT  JOIN Tabelle1 ON Tabelle1.ID = Tabelle.ID

        Comment


        • #5
          Hallo ebis,

          danke für Deine Antwort,

          Originally posted by ebis View Post
          drehs halt um:
          Code:
          SELECT Feld1 
          FROM Tabelle2 
          LEFT  JOIN Tabelle1 ON Tabelle1.ID = Tabelle.ID
          Ähm, oder einfach ein Right Join setzen? Nein, leider nicht das richtige. Das "Umdrehen", Right (Outer) Join, Left (Outer) Join oder Inner Join ist mir bekannt und kann mit einem "Umdrehen" nicht gelöst werden, sonst hätte ich längst selbst die Lösung, wär ja zu einfach . Bitte nochmals meine Beschreibung durchlesen.

          Grüße!

          Comment


          • #6
            Hallo,

            mit einem LEFT OUTER JOIN und Gruppierung sollte das Ergebnis zu erreichen sein - Beispiel:
            HTML Code:
            create table TabA (a int)
            create table TabB (a int, b int)
            
            insert into TabA values(1)
            insert into TabA values(2)
            insert into TabA values(3)
            insert into TabA values(5)
            
            insert into TabB values(1, 111)
            insert into TabB values(2, 222)
            insert into TabB values(3, 333)
            insert into TabB values(3, 33333)
            
            select a.a, min(b.b) as MinB, max(b.b) as MaxB
            from TabA a
            	left join TabB b on a.a = b.a
            group by a.a
            
            drop table TabA
            drop table TabB
            Wenn Du natürlich ganz bestimmte Datensätze aus TabB anzeigen willst, dann musst Du Dich vorher kümmern - über eine temporäre Tabelle oder auch eine View.

            Gruß
            Olaf

            Comment

            Working...
            X