Yadgar: Problem mit Subquery

High!

Weiter geht es mit der Elektroorgel-Datenbank... jetzt möchte ich mir gerne alle dreimanualigen Orgeln anzeigen lassen, also alle Orgeln, die in der Relationstabelle "orgeln_klaviaturen" genau 4 Einträge haben.

Ich probierte es mit folgender Abfrage:

select orgeln.Modell from orgeln where orgeln.Nr=orgeln_klaviaturen.Orgel_Nr and (select count(*) as Manuale from orgeln_klaviaturen group by Orgel_Nr)=4;

...und bekam prompt die Fehlermeldung

ERROR 1054 (42S22): Unknown column 'orgeln_klaviaturen.Orgel_Nr' in 'where clause'

Wieso? Orgel_Nr ist als Spalte in orgeln_klaviaturen vorhanden!

Bis bald im Khyberspace!

Yadgar

  1. Hallo,

    in

    Select orgeln.Modell from orgeln where ...

    sehe ich nur "from orgeln", aber nichts von orgeln_klaviaturen als Tabelle von der man Felder auswählen könnte.

    Du möchstest stattdessen eher einen JOIN auf

      
    ..  
    FROM Orgeln  
    LEFT OUTER JOIN  
    (select Orgel_Nr, count(*) as Manuale  
    from orgeln_klaviaturen  
    group by Orgel_Nr) AS andereTabelle  
    
    

    machen und dann "andereTabelle" in der WHERE Clause benutzen, die ja dann "Orgel_Nr" enthalten würde.

    HTH, Ciao, Frank

    1. High!

      select orgeln.Modell from orgeln left outer join (select count(*) from orgeln_klaviaturen group by Orgel_Nr) as Andere_Tabelle where orgeln.Nr=Andere_Tabelle.Orgel_Nr and count(*)=4;

      funktioniert auch nicht - "Error near orgeln.Nr=Andere_Tabelle.Orgel_Nr and count(*)=4"!

      Was mache ich falsch?

      Bis bald im Khyberspace!

      Yadgar

      1. Hallo,

        select orgeln.Modell from orgeln left outer join (select count(*) from orgeln_klaviaturen group by Orgel_Nr) as Andere_Tabelle where orgeln.Nr=Andere_Tabelle.Orgel_Nr and count(*)=4;

        Was mache ich falsch?

          
        select  
               orgeln.Modell  
          from orgeln  
          left outer join  
               (select count(*) AS Anzahl     -- hier solltest du einen Alias vergeben, damit das Feld ausserhalb (im äusseren Select) verwendbar ist  
                       ,Orgel_Nr              -- das brauchst du auch als Ausgabe, damit du den Join machen kannst  
                  from orgeln_klaviaturen  
                  group by Orgel_Nr) as Andere_Tabelle  
               on orgeln.Orgel_Nr = Andere_Tabelle.Orgel_Nr  -- die Join-Klausel hast du total vergessen, so wie du das mit WHERE versucht hast, geht es nicht  
          where Andere_Tabelle.Anzahl = 4;    -- count(*) ist an der Stelle nicht möglich, ausserdem hast du doch schon den count(*) als Anzahl aus dem inneren Join  
        
        

        Hilft das weiter?

        Ciao, Frank

        1. High!

          Hilft das weiter?

          Bingo! Danke für den Tipp! Jetzt müsstest du mir nur noch privat per Mail deinen Namen rüberwachsen lassen, damit ich dich auf der "Credits"-Seite meines Datenbank-Projekts (URL voraussichtlich: http://www.bergisch-afghanistan.de/greenbook/) nennen kann!

          Bis bald im Khyberspace!

          Yadgar

          1. Oops, meine E-Mail: yazdegird@gmx.de !

  2. Hello,

    Wieso? Orgel_Nr ist als Spalte in orgeln_klaviaturen vorhanden!

    möglich, aber orgeln_klaviaturen nicht in deiner FROM-Klausel. Überhaupt erscheint mir das Subselect nicht viel Sinn zu machen, da es keinerlei Verbindung zum Hauptteil aufweist. Kann es sein, dass du (weder inhaltlich noch syntaktisch riesig überprüft) etwa sowas suchst:
    SELECT orgeln.Modell
    FROM orgeln AS o
    WHERE (SELECT COUNT(*) AS Manuele FROM orgeln_klaviaturen WHERE o.Nr = Ordel_Nr GROUP BY Orgel_Nr) = 4

    MfG
    Rouven

    --
    -------------------
    There's no such thing as a free lunch  --  Milton Friedman
  3. Weiter geht es mit der Elektroorgel-Datenbank... jetzt möchte ich mir gerne alle dreimanualigen Orgeln anzeigen lassen, also alle Orgeln, die in der Relationstabelle "orgeln_klaviaturen" genau 4 Einträge haben.

    Ich probierte es mit folgender Abfrage:

    select orgeln.Modell from orgeln where orgeln.Nr=orgeln_klaviaturen.Orgel_Nr and (select count(*) as Manuale from orgeln_klaviaturen group by Orgel_Nr)=4;

    Müßte das nicht ein LEFT JOIN sein? In etwa so

    SELECT orgeln.Modell, count(Orgel_Nr) as Manuale  
    FROM orgeln LEFT JOIN orgeln_klaviaturen ON  orgeln.Nr = orgeln_klaviaturen.Orgel_Nr  
    WHERE Manuale = 4  
    
    

    Von wegen Groß und Kleinschreibung solltest du konsequenter sein, besser ist sowieso alles klein zu schreiben.

    Struppi.

    1. High!

      Müßte das nicht ein LEFT JOIN sein? In etwa so

      SELECT orgeln.Modell, count(Orgel_Nr) as Manuale
      FROM orgeln LEFT JOIN orgeln_klaviaturen ON  orgeln.Nr = orgeln_klaviaturen.Orgel_Nr
      WHERE Manuale = 4

      Leider auch nicht:

      ERROR 1054 (42S22): Unknown column 'Manuale' in 'where clause'

      ...und überhaupt, müsste da nicht irgendwo ein GROUP BY stehen?

      Bis bald im Khyberspace!

      Yadgar

  4. High!

    Das hier wieder funktioniert:

    select orgeln.Modell, count(Orgel_Nr) from orgeln inner join orgeln_klaviaturen on orgeln.Nr=orgeln_klaviaturen.Orgel_Nr group by Orgel_Nr;

    • es werden alle Orgelmodelle und daneben die Zahl der Einträge in orgeln_klaviaturen, also Anzahl der Manuale+1 (Pedal wird ja mitgezählt) angezeigt!

    Aber wie bekomme ich diese Auswahl auf die Orgeln mit genau 4 Einträge in orgeln_klaviaturen eingegrenzt?

    Bis bald im Khyberspace!

    Yadgar