Announcement

Collapse
No announcement yet.

Schwierigkeiten bei einer SQL-Abfrage

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

  • Schwierigkeiten bei einer SQL-Abfrage

    Hallo,

    folgende Situation:

    Es sollen z.B. Konzertdaten gespeichert werden. Jedes Konzert hat einen Headliner und eine n Anzahl an Vorbands oder auch keine Vorband. Aus dieser Situation habe ich folgende Tabellen kreiert.
    <PRE>
    TblKonzert
    (
    konzertID (int Identity 1,1, not null, primary key)
    headlinerID (int, not null, foreign key references TblBand(bandID))
    einlass (varchar, 5, not null)
    ...
    )
    </PRE><PRE>
    TblBand
    (
    bandID (int Identity 1,1, not null, primary key )
    bandName (varchar, 35, not null)
    bandURL (varchar, 30, null)
    ...
    )
    </PRE><PRE>
    // Zwischen Tabelle zur auflösen der m:n Beziehung
    TblKonzertSupport // Zusammengesetzter Primärschlüssel (konzertID und bandID)
    (
    konzertID (int , not null, primary key, foreign key references TblKonzert(konzertID))
    bandID (int, not null, primary key, foreign key references TblBand(bandID))
    )
    </PRE>
    Ich möchte eine Abfrage schreiben die alle Konzerte mit dem Namen des Headliners und der Name der n Anzahl von Vorbands ausgibt. Es muss anschließend möglich sein auf die Summe der Vorbands einzeln zugreifen zu können. Zurzeit send ich zwei SQL–Kommandos, das ist aber in meine Augen keine schöne Lösung. Folgende technischen Ressourcen stehen mir zu Verfügung: C#, MS SQL-Server

    Vielen Dank im Voraus!

    Stefan

  • #2
    Hallo Stefan,<BR><BR>wenn ich alles richtig verstanden habe, dann versuch doch mal das:
    <PRE>
    select
    a.konzertID
    ,b.bandName as Headliner
    ,count(*) as AnzVorbands
    from TblKonzert a
    inner join TblBand b on b.bandID = a.headlinerID
    inner join TblKonzertSupport c on c.konzertID = a.konzertID
    inner join TblBand d on d.bandID = c.bandID
    group by
    a.konzertID
    ,b.bandName
    </PRE>
    Viele Grüße Ola

    Comment


    • #3
      Hey Olaf!

      das Ergebnis deiner Abfrage sieht wie folgt aus:
      <PRE>
      konzertID Headliner AnzVorbands
      1 Turbonegro 2
      .
      ..
      </PRE>
      Ich hätte aber gerne folgendes Resultat;
      <PRE>
      konzertID Headliner Vorbands
      1 Turbonegro H2O, ALL, ...
      .
      ..
      </PRE&gt

      Comment


      • #4
        Hallo Stefan,<BR><BR>ja, da ist natürlich etwas mehr Aufwand angesagt. Leider kommt man da um einen Cursor oder zumindest eine Schleife nicht umhin. Mein Vorschlag wäre dieser:
        <PRE>
        Create Function dbo.f_GetVorbands
        (
        @i_konzertID int
        )
        returns varchar(4000)
        as
        begin
        --
        declare
        @vcOut varchar(4000)
        --Cursor ist nötig
        declare c cursor local fast_forward read_only
        for
        select b.bandName
        from TblKonzertSupport a
        inner join TblBand b on b.bandID = a.bandID
        where a.konzertID = @i_konzertID
        --
        declare @vcBandName varchar(35)
        --
        open c
        fetch next from c into @vcBandName
        --
        set @vcOut = ''
        while @@fetch_status = 0
        begin
        set @vcOut = @vcOut + @vcBandName + ', '
        --
        fetch next from c into @vcBandName
        end
        --
        close c
        deallocate c
        --letztes Komma entfernen
        set @vcOut = left(@vcOut, len(@vcOut) - 1)
        --
        return @vcOut
        --
        end
        </PRE>
        ...und dann sollte diese Abfrage funktionieren:
        <PRE>
        select
        a.konzertID
        ,b.bandName as Headliner
        ,dbo.f_GetVorbands(a.konzertID) as ListeVorbands
        from TblKonzert a
        inner join TblBand b on b.bandID = a.headlinerID
        group by
        a.konzertID
        ,b.bandName
        </PRE>
        Viele Grüße Ola

        Comment

        Working...
        X