none
Access Abfrage mit 2 Access Unterabfragen in SQL String Umbauen

    Frage

  • Hallo

    Ich bekomme es nicht in den Kopf

    Ich habe eine Abfrage in der ich 2 „Unterabfrage“ mit einem RIGHT JOIN an die „Haupttabelle“ binde

    Ausgeben möchte

    Funktioniert auch

    Aber ich möchte die beiden Unterabfragen gerne mit in dem SQL String einbauen

    Hier der SQL mit den beiden Abfragen die ich in Access gespeichert habe

    SELECT tblAdressen_TeleNummern.*, Abfrage29.MaxvonID_ATN AS Fernwartung, Abfrage30.MaxvonID_ATN AS RDP
    
    FROM Abfrage30 RIGHT JOIN (Abfrage29 RIGHT JOIN tblAdressen_TeleNummern ON Abfrage29.MaxvonID_ATN = tblAdressen_TeleNummern.ID) ON Abfrage30.MaxvonID_ATN = tblAdressen_TeleNummern.ID
    
    WHERE (((tblAdressen_TeleNummern.Adresse)=699) AND ((tblAdressen_TeleNummern.NichtInsTelefonbuch)=False))
    
    ORDER BY tblAdressen_TeleNummern.TInfo;

    Hier die beiden Abfragen als SQLString

    Abfrage29:

    SELECT Max(tblAdressen_www_RDP.ID_ATN) AS MaxvonID_ATN, Count(tblAdressen_www_RDP.ID_ATN) AS AnzahlvonID_ATN FROM tblAdressen_www_RDP WHERE tblAdressen_www_RDP.UeberVNC=True

    Abfrage30:

    SELECT Count(tblAdressen_www_RDP.ID_ATN) AS AnzahlvonID_ATN, Max(tblAdressen_www_RDP.ID_ATN) AS MaxvonID_ATN

    FROM tblAdressen_www_RDP

    WHERE (((tblAdressen_www_RDP.UeberVNC)=False));

    Hintergrund ist ich möchte in einem Formular direkt sehen ob Datensätze in den jeweiligen anderen Tabellen vorhanden sind – Anzahl und Max benötige ich da in den Untertabellen zu dem Hauptdatensatz mehrere Datensätze vorhanden sein können

    Kann mich dort jemand weiter helfen

    Mittwoch, 28. Februar 2018 08:28

Antworten

  • Hi,

    aufgrund der IIRC nicht vorhandenen Möglichkeit in Access, SQL Statements ordentlich zu formatieren, würde ich eigentlich eher genau das Gegenteil behaupten. Ein großes SQL Statement ist weder ordentlich lesbar noch wartbar.

    Aber grundsätzlich sollte das schon gehen, wenn Du die Unterabfragen klammerst und mit einem Alias versiehst.

    Als Beispiel (nicht getestet):

    SELECT ...
    FROM   Tabelle t
           INNER JOIN ( SELECT ... FROM Andere Tabelle ) AS a ON t.Feld = a.Feld
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert MCDPone Mittwoch, 28. Februar 2018 12:56
    Mittwoch, 28. Februar 2018 11:15
    Moderator

Alle Antworten

  • Hi,

    ehrlich gesagt hab ich nicht verstanden, wo das Problem liegt.

    Willst Du keine separaten Abfragen in Access haben, sondern den Inhalt der Abfragen direkt in ein großes SQL Statement schreiben?

    Oder willst Du auf die JOINS verzichten?

    Oder ...?

    Wichtig hierfür wäre: Sind die Abfragen in Access oder in SQL Server gespeichert? (Frage nur, weil die letzte Zeit bei Fragen ähnlicher Art meistens SQL Server die Datenquelle war)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 28. Februar 2018 08:37
    Moderator
  • Genau ich möchte keine separate Abfrage in Access Haben sondern ein Grosses SQL Statement

    die Abfragen sind in Access gespeichert

    ich weise einem Formular beim Öffnen die Datenherkunft zu und genau dafür brauche ich den/das SQL Statement

    klar geht es auch mit den Abfragen in Access gespeichert - aber das wird mir irgendwann zu unübersichtlich

    Mittwoch, 28. Februar 2018 08:50
  • Hi,

    aufgrund der IIRC nicht vorhandenen Möglichkeit in Access, SQL Statements ordentlich zu formatieren, würde ich eigentlich eher genau das Gegenteil behaupten. Ein großes SQL Statement ist weder ordentlich lesbar noch wartbar.

    Aber grundsätzlich sollte das schon gehen, wenn Du die Unterabfragen klammerst und mit einem Alias versiehst.

    Als Beispiel (nicht getestet):

    SELECT ...
    FROM   Tabelle t
           INNER JOIN ( SELECT ... FROM Andere Tabelle ) AS a ON t.Feld = a.Feld
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert MCDPone Mittwoch, 28. Februar 2018 12:56
    Mittwoch, 28. Februar 2018 11:15
    Moderator
  • Danke - im Gesamtwerk ist es nun so

    SELECT tblAdressen_TeleNummern.*, IstVNC.MaxvonID_ATN, IstRDP.MaxvonID_ATN
    FROM   tblAdressen_TeleNummern
    		right join (SELECT Max(tblAdressen_www_RDP.ID_ATN) AS MaxvonID_ATN, Count(tblAdressen_www_RDP.ID_ATN) AS AnzahlvonID_ATN FROM tblAdressen_www_RDP WHERE tblAdressen_www_RDP.UeberVNC<>0) AS IstVNC on tblAdressen_TeleNummern.ID = IstVNC.MaxvonID_ATN
    		right join (SELECT Max(tblAdressen_www_RDP.ID_ATN) AS MaxvonID_ATN, Count(tblAdressen_www_RDP.ID_ATN) AS AnzahlvonID_ATN FROM tblAdressen_www_RDP WHERE tblAdressen_www_RDP.UeberVNC=0) AS IstRDP on tblAdressen_TeleNummern.ID = IstVNC.MaxvonID_ATN
    where
    tblAdressen_TeleNummern.Adresse=699

    mir fehlte die richtige "syntax"

    Zu deiner Lesbarkeit hast du recht - zusammensetzen der Abfragen mache im im SQL Server MMS

    wenn ich in Access soetwas über Abfrage erstelle ist das Ergebnis langsamer - darum mache ich es auf dieser Art.

    Denke mal das liegt an der JET ODBC... zusammenarbeit - weil wenn ich mir das im SQL Server Profiler anschaue werden abfragen dann ganz anders ausgeführt. 

    Und eben ich sehe in der Programmierung den SQL String und muss dann nicht erst in der Abfrage nachschauen - aber ich denke da geht jeder seinen weg

    Mittwoch, 28. Februar 2018 12:56
  • Am 28.02.2018 schrieb MCDPone:

    Denke mal das liegt an der JET ODBC... zusammenarbeit - weil wenn ich mir das im SQL Server Profiler anschaue werden abfragen dann ganz anders ausgeführt. 

    Und eben ich sehe in der Programmierung den SQL String und muss dann nicht erst in der Abfrage nachschauen - aber ich denke da geht jeder seinen weg

    Wenn du an der Stelle einen SQL Server als Backend hast, würde ich
    eine SP auf dem SQL Server anlegen und per PT-Abfrage die Daten holen.

    Servus
    Winfried


    Access-FAQ: http://www.donkarl.com/AccessFAQ.htm Access-Stammtisch: http://www.access-muenchen.de
    NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/
    vbeTwister: http://www.vbetwister.com/

    Mittwoch, 28. Februar 2018 16:41
  • Recht hast du aber ich habe das Produkt sowohl als accdb backend und als MSSQL und so ist es einfacher - für mich - momentan

    was ich noch nicht getestet habe ist die SP zur Laufzeit auf dem SQL Server anzulegen und dann abzufragen

    Da bin ich mir noch nicht sicher wie das im Mehrbenutzer Betrieb so wirklich auf dem SQL Server läuft wenn 2 auf einmal die gleiche abfrage anlegen oder der eine diese angelegte gerade löscht

    Donnerstag, 1. März 2018 07:04
  • Hi,

    abgesehen von den notwendigen Berechtigungen fürs Anlegen der SP und dann zwangsweise auftretetenden Kollisionen im Mehrbenutzerbetrieb solltest Du das Konzept, die SP zur Laufzeit zu erstellen, wieder zu löschen, neu zu erstellen, wieder zu löschen, usw. einfach wieder vergessen.

    Das ist abgesehen von der IMHO recht absurden Idee in der Praxis nicht mal ansatzweise einsetzbar. Zudem würde es wohl rein gar nichts bringen.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Donnerstag, 1. März 2018 07:49
    Moderator
  • Am 01.03.2018 schrieb MCDPone:

    Recht hast du aber ich habe das Produkt sowohl als accdb backend und als MSSQL und so ist es einfacher - für mich - momentan

    Ja, jetzt ist es einfacher für dich es nicht zu tun. Es wäre jetzt
    aber einfacher für beide das richtig zu machen. Wenn Du es später
    ändern willst, wäre es nicht mehr machbar.

    was ich noch nicht getestet habe ist die SP zur Laufzeit auf dem SQL Server anzulegen und dann abzufragen

    Da bin ich mir noch nicht sicher wie das im Mehrbenutzer Betrieb so wirklich auf dem SQL Server läuft wenn 2 auf einmal die gleiche abfrage anlegen oder der eine diese angelegte gerade löscht

    Dieser Gedanke käme mir nie. Setz dich mit dem SQL Server auseinander
    und lerne, dann weißt du was wir meinen.

    Servus
    Winfried


    Access-FAQ: http://www.donkarl.com/AccessFAQ.htm Access-Stammtisch: http://www.access-muenchen.de
    NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/
    vbeTwister: http://www.vbetwister.com/

    Donnerstag, 1. März 2018 16:30