Announcement

Collapse
No announcement yet.

SQL Abfrage über Zeilen

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

  • SQL Abfrage über Zeilen

    Hallo Zusammen,

    ich habe ein "kleines" Problem eine Abfrage zusammen zu bekommen.

    Folgender Aufbau:


    Code:
    Tablle Maschinen
     
    Masch_ID, Masch_Name, Masch_Standort,....
    1              Xdoor 45,      München
    ..
    ..
     
    Tabelle Eigenschaften
     
    EIG_ID, Eig_Masch_ID, Eig_Name, Eig_Wert
    1           1           Farbe       Rot
    2           1           Baujahr    2006
    3           1           Gewicht    4957
    ..
    ..
    Jetzt versuche ich eine Abfrage zusammen zu basteln, mit der man alle Maschinen finden kann, die bestimmte Kriterien erfüllen. Hier mal ein Beispiel:

    Alle ROTEN Maschinen mit dem BAUJAHR 2006

    Wo ich irgendwie auf dem Schlauch stehe ist die Tatsache, dass es sich hierbei nicht einfach um mehrere Spalten handelt, die Gewisse Kriterien erfüllen sollen sondern halt um verschiedene ZEILEN.

    Ich hoffe es hat jemand eine Idee die mich weiterbringt.

    Danke.
    Maria

  • #2
    Hallo,

    glaube UNION ist das Stichwort.

    Für dein Bsp. alle Roten aus dem Jarh 2006
    [highlight=sql]
    SELECT m.Masch_ID, m.Masch_Name
    FROM Maschinen AS m
    JOIN Eigenschaften AS e
    ON m.Masch_ID = Eig_Masch_ID
    WHERE e.Eig_Name = 'Farbe' AND
    e.Eig_Wert = 'Rot'
    UNION
    SELECT m.Masch_ID, m.Masch_Name
    FROM Maschinen AS m
    JOIN Eigenschaften AS e
    ON m.Masch_ID = Eig_Masch_ID
    WHERE e.Eig_Name = 'Baujahr' AND
    e.Eig_Wert = 2006
    [/highlight]

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo!

      Wenn ich richtig verstanden habe soll die Maschine ALLE Kriterien erfüllen. Mit der oben genannen UNION-Abfrage erhält man jedoch alle Maschinen die auch nur eines der Kriterien erfüllen.

      Habe meine Antwort nich ausprobiert müßte aber gehen.
      Lösung(en):
      a) Das Schlüsselwort UNION durch INTERSECT austauschen (ab MSSQL 2005) vorhanden. Bildet die Schnittmenge zwischen den beiden Teilabfragen. (Evtl. muss m.Masch_Name zunächst aus Abfrage)
      b) Abfrage mit einem Kriterim Aufbauen und über IN-Operation in der Where-Klausel eine zweite Abfrage (wie zweiter Teil bei gfoidl) mit der zweiten Ergebnismenge weiter einschränken
      [highlight=SQL]
      Select m.Masch_ID
      From Maschinen AS m
      Join Eigenschaften AS e
      ON m.Masch_ID= e.Eig_Masch_ID
      Where e.Eig_Name = 'Farbe' And
      e.Eig_Wert = 'Rot'
      and
      Masch_ID in
      (Select n.Masch_ID
      from Maschinen as n
      join Eigenschaften AS f ON n.Masch_ID = f.Eig_Masch_ID
      WHERE f.Eig_Name = 'Baujahr'
      AND f.Eig_Wert = 2006
      )
      [/highlight]
      c) Eine Pivot-Tabelle erzeugen, mit z.B. CASE oder ab MSSQL2005 mit PIVOT. Danach das Ergebnis Filtern.

      mfg
      Thomas

      Comment


      • #4
        Mit der oben genannen UNION-Abfrage erhält man jedoch alle Maschinen die auch nur eines der Kriterien erfüllen.
        Stimmt. Da habe ich einen (großen) Fehler gebaut
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Thomas... *knuuuuutsch*

          Vielen Dank.

          Damit funktioniert es prima!!!

          Comment

          Working...
          X