none
verschachtelte Abfrage RRS feed

  • Frage

  • Hallo zusammen,

    ich lerne jeden Tag etwas neues in der Anwendung von SQL, aber es tauchen immer wieder neue Probleme auf:

    Ich habe eine Abfrage, die ais einer einer Tabelle Räume mit bestimmten Kriterien filtert:

    SELECT RaumID, Ort, Sitzplätze, usw FROM tblRaumliste WHERE Sitzplätze > 10

    Mit dieser  Auswahl soll überprüft werden, ob in einem Zeitraum schon eine Belegung vrhranden ist:

    SELECT RaumBelegung, Beginn, Ende FROM tblRaumbelegung WHERE Beginn between Datum1 und Datum2 und RaumID = x

    Für x sollte der Raum aus der ersten Abfrage stehen und wenn eine Belegung gefunden wird, der Datensatz markiert werden z.B. mit belegt.

    Kann mir jemand einen Tip geben, wie ich das ganze in eine Abfrage hinein bekomme?

    Danke für Tips

    Michael

    Mittwoch, 19. Mai 2021 05:15

Antworten

  • Hi Michael,
    probier mal:

    SELECT RaumBelegung, Beginn, Ende FROM tblRaumbelegung 
      WHERE Beginn between Datum1 AND Datum2 AND 
      RaumID IN (SELECT RaumID FROM tblRaumliste WHERE Sitzplätze > 10)


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Mittwoch, 19. Mai 2021 05:24
  • Hallo Michael,

    so 100% verständlich ist Dein Post nicht, aber wenn ich es zumindest teilweise richtig verstanden hab, kannst Du es mit einer Unterabfrage (sub-query) lösen, sprich die RaumID's ermitteln und damit filtern:

    SELECT RaumBelegung, Beginn, Ende 
    FROM tblRaumbelegung 
    WHERE Beginn between Datum1 AND Datum2 
          AND RaumID IN
          (SELECT RaumID
           FROM tblRaumliste 
           WHERE Sitzplätze > 10)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 19. Mai 2021 05:30
  • Hallo Michael,

    leider fehlte bei der Frage ein kleines Repro-Skript, bzw. Beispieldaten. Ggf. suchst Du auch so etwas:

    Create Table #tblRaumbelegung (RaumID int , Beginn datetime2, Ende datetime2, Raumbelegung varchar(20));
    Create Table #tblRaumliste (RaumID int, Sitzplätze int);
    
    Insert into #tblRaumbelegung(RaumID, Beginn, Ende, Raumbelegung) Values (1, '2021-05-19 08:00:00', '2021-05-19 08:59:00', 'Veranstaltung');
    Insert into #tblRaumbelegung(RaumID, Beginn, Ende, Raumbelegung) Values (1, '2021-05-19 10:00:00', '2021-05-19 10:59:00', 'Veranstaltung');
    Insert into #tblRaumliste(RaumID, Sitzplätze) Values (1, 100);
    
    SELECT case when b.RaumID is null then 'frei' else 'belegt' end as Raumbelegung, Beginn, Ende 
    	FROM #tblRaumliste l
    	Left Join #tblRaumbelegung b
    		on b.RaumID = l.RaumID
    		and b.Beginn between '2021-05-19 09:00:00' AND '2021-05-19 09:59:00' 
    		AND l.Sitzplätze > 10;
    
    SELECT case when b.RaumID is null then 'frei' else 'belegt' end as Raumbelegung, Beginn, Ende 
    	FROM #tblRaumliste l
    	Left Join #tblRaumbelegung b
    		on b.RaumID = l.RaumID
    		and b.Beginn between '2021-05-19 08:00:00' AND '2021-05-19 09:59:00' 
    		AND l.Sitzplätze > 10;
    
    
    go
    drop Table #tblRaumbelegung;
    drop Table #tblRaumliste;


    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    Mittwoch, 19. Mai 2021 05:59

Alle Antworten

  • Hi Michael,
    probier mal:

    SELECT RaumBelegung, Beginn, Ende FROM tblRaumbelegung 
      WHERE Beginn between Datum1 AND Datum2 AND 
      RaumID IN (SELECT RaumID FROM tblRaumliste WHERE Sitzplätze > 10)


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Mittwoch, 19. Mai 2021 05:24
  • Hallo Michael,

    so 100% verständlich ist Dein Post nicht, aber wenn ich es zumindest teilweise richtig verstanden hab, kannst Du es mit einer Unterabfrage (sub-query) lösen, sprich die RaumID's ermitteln und damit filtern:

    SELECT RaumBelegung, Beginn, Ende 
    FROM tblRaumbelegung 
    WHERE Beginn between Datum1 AND Datum2 
          AND RaumID IN
          (SELECT RaumID
           FROM tblRaumliste 
           WHERE Sitzplätze > 10)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 19. Mai 2021 05:30
  • Hallo Michael,

    leider fehlte bei der Frage ein kleines Repro-Skript, bzw. Beispieldaten. Ggf. suchst Du auch so etwas:

    Create Table #tblRaumbelegung (RaumID int , Beginn datetime2, Ende datetime2, Raumbelegung varchar(20));
    Create Table #tblRaumliste (RaumID int, Sitzplätze int);
    
    Insert into #tblRaumbelegung(RaumID, Beginn, Ende, Raumbelegung) Values (1, '2021-05-19 08:00:00', '2021-05-19 08:59:00', 'Veranstaltung');
    Insert into #tblRaumbelegung(RaumID, Beginn, Ende, Raumbelegung) Values (1, '2021-05-19 10:00:00', '2021-05-19 10:59:00', 'Veranstaltung');
    Insert into #tblRaumliste(RaumID, Sitzplätze) Values (1, 100);
    
    SELECT case when b.RaumID is null then 'frei' else 'belegt' end as Raumbelegung, Beginn, Ende 
    	FROM #tblRaumliste l
    	Left Join #tblRaumbelegung b
    		on b.RaumID = l.RaumID
    		and b.Beginn between '2021-05-19 09:00:00' AND '2021-05-19 09:59:00' 
    		AND l.Sitzplätze > 10;
    
    SELECT case when b.RaumID is null then 'frei' else 'belegt' end as Raumbelegung, Beginn, Ende 
    	FROM #tblRaumliste l
    	Left Join #tblRaumbelegung b
    		on b.RaumID = l.RaumID
    		and b.Beginn between '2021-05-19 08:00:00' AND '2021-05-19 09:59:00' 
    		AND l.Sitzplätze > 10;
    
    
    go
    drop Table #tblRaumbelegung;
    drop Table #tblRaumliste;


    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    Mittwoch, 19. Mai 2021 05:59