{"id":55000616,"date":"2023-04-01T00:00:00","date_gmt":"2023-04-01T00:00:00","guid":{"rendered":"http:\/\/access-basics.de\/616"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Abfragen_basics_Unterabfragen","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html","title":{"rendered":"Abfragen [basics]: Unterabfragen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/fa71df63042648f099c57d91fd74fe7e\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class='introduction'>Unterabfragen Was soll das nun wieder sein Ich kenne Unterformulare, aber Unterabfragen Nun: Unterabfragen sind ganz einfach Abfragen, deren Ergebnis als Kriterium in einer &uuml;bergeordneten Abfrage verwendet wird oder deren Ergebnis als Teil des Ergebnisses der Hauptabfrage ausgegeben werden soll. Dabei gibt es f&uuml;r Unterabfragen spezielle Vorgaben, zum Beispiel dass diese nur ein einziges Feld zur&uuml;ckliefern d&uuml;rfen (wobei das Feld auch eine Funktion eines Feldes sein kann wie eine Summe oder Anzahl). Wie genau man Unterabfragen definiert und wozu Du diese einsetzen kannst, zeige ich Dir in diesem Artikel.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels findest Du in der Datenbank <b>2301_AbfragenBasics_Unterabfragen.accdb<\/b>.<\/p>\n<h2>Es geht nicht ohne SQL-Ausdr&uuml;cke<\/h2>\n<p>Die schlechte Nachricht vorneweg: Im Gegensatz zu den &uuml;brigen Abfragen, die wir in der <b>Abfragen [basics]<\/b>-Beitragsreihe vorgestellt haben, kommen wir bei Unterabfragen nicht komplett mit dem Zusammenklicken von Abfragen &uuml;ber die Entwurfsansicht aus. Unterabfragen m&uuml;ssen n&auml;mlich als SQL-Ausdruck angegeben werden, also zum Beispiel wie folgt:<\/p>\n<pre>SELECT KundeID FROM tblKunden<\/pre>\n<p>Die gute Nachricht lautet jedoch: In den meisten F&auml;llen k&ouml;nnen wir diese SELECT-Abfragen zuvor wiederum mit dem Abfrageeditor zusammenstellen und holen uns den ben&ouml;tigten SQL-Ausdruck dann aus der SQL-Ansicht der Abfrage.<\/p>\n<h2>SELECT ist Trumpf<\/h2>\n<p>Unterabfragen sind immer Auswahlabfragen, die allerdings eine entscheidende Einschr&auml;nkung aufweisen: Sie enthalten nur ein Ergebnisfeld. Wir k&ouml;nnen allerdings auf mehrere Tabellen, Kriterien, Gruppierungen und weitere Techniken zur&uuml;ckgreifen.<\/p>\n<h2>Wo kann man Unterabfragen einsetzen<\/h2>\n<p>Unterabfragen kann man vor allem an zwei Stellen nutzen:<\/p>\n<ul>\n<li>in Ausdr&uuml;cken, also in berechneten Feldern<\/li>\n<li>in Kriterien von Abfragefeldern<\/li>\n<\/ul>\n<h2>Unterabfrage als Ausdruck<\/h2>\n<p>In einem berechneten Feld kann man das Ergebnis einer beliebigen Unterabfrage entweder als alleinigen Wert oder als Teil eines Ausdrucks mit anderen Informationen ausgeben. Wir k&ouml;nnten beispielsweise die Anzahl der Artikel der Tabelle in der gleichen Zeile mit den Daten des Artikels ausgeben. Das sieht zum Beispiel wie im Screenshot aus Bild 1 aus. Hier f&uuml;gen wir also die folgende Abfrage als Unterabfrage hinzu:<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_002.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_002.png\" alt=\"Beispiel einer Unterabfrage zur Ermittlung der Artikelanzahl\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Beispiel einer Unterabfrage zur Ermittlung der Artikelanzahl<\/p>\n<pre>SELECT Count(*) FROM tblArtikel<\/pre>\n<p>Damit diese ihre Werte auch in dem von uns hinzugef&uuml;gten Feld anzeigt, m&uuml;ssen wir einen Feldnamen f&uuml;r dieses berechnete Feld hinterlegen, in diesem Fall <b>AnzahlArtikel<\/b>. Au&szlig;erdem ist es zwingend erforderlich, dass wir die Unterabfrage in Klammern einfassen, sodass dieser Ausdruck zum Einsatz kommt:<\/p>\n<pre>AnzahlArtikel: (SELECT Count(*) FROM tblArtikel)<\/pre>\n<p>Wechseln wir in die Datenblattansicht, erhalten wir das Ergebnis aus Bild 2. Auf die gleiche Weise k&ouml;nnen wir auch Daten aus anderen Tabellen anzeigen.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_003.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_003.png\" alt=\"Die Anzahl der Artikel erscheint in jeder Zeile.\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Die Anzahl der Artikel erscheint in jeder Zeile.<\/p>\n<h2>Unterabfrage als Ausdruck mit Bezug zur Hauptabfrage<\/h2>\n<p>Das war ein sehr einfaches Beispiel, das kaum praktischen Nutzen hat. Was eher vorkommen k&ouml;nnte, w&auml;re der Wunsch nach der Anzeige der Anzahl der Artikel der Kategorie des aktuellen Artikels. Sprich: Dies Hauptabfrage zeigt weiterhin alle Artikel der Tabelle <b>tblArtikel <\/b>an. In der Unterabfrage wollen wir die Anzahl der Artikel ermitteln, die der Kategorie angeh&ouml;ren, zu welcher der aktuelle Artikel der Hauptabfrage geh&ouml;rt. Dazu m&uuml;ssen wir nun in der Unterabfrage ein Kriterium hinzuf&uuml;gen, dass sich auf die Kategorie-ID des Artikels aus der Hauptabfrage bezieht.<\/p>\n<p>Das ist nicht ganz so einfach, denn wie sollen wir bei der Formulierung des Kriteriums in der Unterabfrage das Feld <b>KategorieID <\/b>der Hauptabfrage mit dem gleichnamigen Feld der Unterabfrage vergleichen &#8211; wenn beide sich auf die gleiche Tabelle beziehen Auch zu diesem Zweck gibt es in relationalen Datenbanken die M&ouml;glichkeit, einer Tabelle einen Aliasnamen zu geben. Wir legen also entweder in der Haupt- oder in der Unterabfrage fest, dass die Tabelle <b>tblArtikel <\/b>unter einem anderen Namen angesprochen werden soll, beispielsweise <b>t1<\/b>. Wir k&ouml;nnten auch f&uuml;r beide Instanzen der Tabelle <b>tblArtikel <\/b>in der Datenbank einen Aliasnamen vergeben, beispielsweise <b>t1<\/b> f&uuml;r die Tabelle in der Hauptabfrage und <b>t2<\/b>, damit es richtig klar wird.<\/p>\n<p>Um f&uuml;r die Tabelle <b>tblArtikel <\/b>in der Hauptabfrage einen Aliasnamen festzulegen, aktivieren wir das Eigenschaftenblatt f&uuml;r diese Tabelle und legen den Aliasnamen f&uuml;r die Eigenschaft <b>Alias <\/b>fest (siehe Bild 3).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_006.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_006.png\" alt=\"Festlegen eines Aliasnamens f&uuml;r eine Tabelle einer Abfrage\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Festlegen eines Aliasnamens f&uuml;r eine Tabelle einer Abfrage<\/p>\n<p>Allerdings erscheint nun &uuml;berall in der Abfrage <b>t1 <\/b>statt <b>tblArtikel<\/b>, was bei Verwendung mehrerer Tabellen in der Abfrage nicht zur &Uuml;bersicht beitr&auml;gt (siehe Bild 4).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_007.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_007.png\" alt=\"Tabelle mit Aliasname in einer Abfrage\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 4: Tabelle mit Aliasname in einer Abfrage<\/p>\n<p>Daher w&uuml;rden wir in diesem Fall eher der Tabelle in der Unterabfrage den Aliasnamen <b>t1 <\/b>zuweisen (zuvor ersetzen wir den Aliasnamen der Tabelle in der Hauptabfrage allerdings wieder durch den eigentlichen Namen der Tabelle, also <b>tblArtikel<\/b>). Um einer Tabelle im SQL-Code, den wir f&uuml;r Unterabfragen angeben m&uuml;ssen, mit einem Aliasnamen zu versehen, geben wir hinter dem Tabellennamen im <b>FROM<\/b>-Bereich das <b>AS<\/b>-Schl&uuml;sselwort gefolgt vom Aliasnamen an:<\/p>\n<pre>SELECT Count(*) FROM tblArtikel AS t1 <\/pre>\n<p>Dieser brauchen wir nun nur noch das Kriterium zuzuweisen, in dem wir die <b>KategorieID<\/b> der Tabelle der Unterabfrage mit der der Tabelle in der Hauptabfrage abgleichen:<\/p>\n<pre>SELECT Count(*) FROM tblArtikel AS t1 WHERE t1.KategorieID = tblArtikel.KategorieID<\/pre>\n<p>Diese Unterabfrage soll also die Anzahl der Datens&auml;tze aus der Tabelle <b>tblArtikel <\/b>holen, deren <b>KategorieID <\/b>mit der <b>KategorieID<\/b> des aktuellen Datensatzes in der Abfrage entspricht. Dazu fassen wir die Unterabfrage noch in Klammern ein und stellen dieser den Namen des berechneten Feldes voran. Der Abfrageentwurf sieht anschlie&szlig;end wie in Bild 5 aus.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_004.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_004.png\" alt=\"Ermitteln der Anzahl der Artikel der Kategorie des aktuellen Artikels\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 5: Ermitteln der Anzahl der Artikel der Kategorie des aktuellen Artikels<\/p>\n<p>Wechseln wir jetzt in die Datenblattansicht, erscheint zu jedem Artikel die Anzahl der Artikel der gleichen Kategorie (siehe Bild 6).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_008.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_008.png\" alt=\"Anzahl der Artikel der Kategorie des aktuellen Artikels\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 6: Anzahl der Artikel der Kategorie des aktuellen Artikels<\/p>\n<h2>Anzahl verkn&uuml;pfter Datens&auml;tze<\/h2>\n<p>Im n&auml;chsten Beispiel wollen wir herausfinden, wie viele verkn&uuml;pfte Datens&auml;tze es f&uuml;r die Datens&auml;tze der zu untersuchenden Tabelle gibt. Im konkreten Fall interessiert uns die Anzahl der Bestellungen eines jeden Kunden, die wir als zus&auml;tzliches Feld des Abfrageergebnisses ausgeben wollen. Dazu nutzen wir eine Abfrage, die in der Hauptabfrage Daten der Tabelle <b>tblKunden <\/b>anzeigt und in einem berechneten Feld namens <b>AnzahlBestellungen <\/b>die Anzahl der Datens&auml;tze der Tabelle <b>tblBestellungen<\/b>, die mit dem aktuellen Kundendatensatz verkn&uuml;pft sind. Die dazu ben&ouml;tigte Unterabfrage enth&auml;lt wieder eine Bedingung, welche ein Feld der Tabelle der Unterabfrage mit einem Feld der Tabelle der Hauptabfrage abgleicht. Diesmal handelt es sich allerdings um unterschiedliche Tabellen, daher brauchen wir keinen Aliasnamen zu definieren. Der Entwurf der Unterabfrage ist in zu Bild 7 finden.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_009.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_009.png\" alt=\"Entwurf der Abfrage zur Ermittlung der Anzahl der Bestellungen eines Kunden\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 7: Entwurf der Abfrage zur Ermittlung der Anzahl der Bestellungen eines Kunden<\/p>\n<p>Wechseln wir in die Datenblattansicht, liefert die Abfrage alle Kunden mit der Anzahl ihrer Bestellungen (siehe Bild 8).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_010.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_010.png\" alt=\"Ausgabe der Anzahl der Bestellungen je Kunde\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 8: Ausgabe der Anzahl der Bestellungen je Kunde<\/p>\n<h2>Verkn&uuml;pfte Daten mit Exists suchen<\/h2>\n<p>Mit dem <b>Exists<\/b>-Schl&uuml;sselwort als Operator vor einer Unterabfrage k&ouml;nnen wir pr&uuml;fen, ob diese Abfrage &uuml;berhaupt Datens&auml;tze enth&auml;lt. <b>Exists <\/b>liefert dazu den Wert <b>True <\/b>oder <b>False <\/b>zur&uuml;ck. Diese Technik k&ouml;nnen wir beispielsweise nutzen, um Kunden auszugeben, die bisher noch keine Bestellung gemacht haben.<\/p>\n<p>Das Ergebnis des berechneten Ausdrucks mit dem <b>Exists<\/b>-Schl&uuml;sselwort und der Unterabfrage versehen wir noch mit einem Kriterium, beispielsweise <b>Falsch<\/b>, um nur die Datens&auml;tze der Tabelle <b>tblKunden <\/b>anzuzeigen, f&uuml;r die es noch keinen verkn&uuml;pften Datensatz in der Tabelle <b>tblBestellungen <\/b>gibt.<\/p>\n<p>Das berechnete Feld mit der Unterabfrage erh&auml;lt folgenden Ausdruck:<\/p>\n<pre>BestellungVorhanden: Exists (SELECT BestellungID FROM tblBestellungen WHERE tblBestellungen.KundeID = tblKunden.KundeID)<\/pre>\n<p>Wir betten diese wie in Bild 9 in die Abfrage ein und f&uuml;gen noch den Wert <b>Falsch<\/b> als Kriterium hinzu.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_011.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_011.png\" alt=\"Abfrage zur Ermittlung aller Kunden, f&uuml;r die noch keine Abfrage existiert\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 9: Abfrage zur Ermittlung aller Kunden, f&uuml;r die noch keine Abfrage existiert<\/p>\n<p>Das Ergebnis sehen wir in Bild 10. Die Kunden bestellen also recht zuverl&auml;ssig. Allerdings k&ouml;nnen diese Bestellungen auch bereits sehr lange zur&uuml;ckliegen. Mit einer kleinen Anpassung l&auml;sst sich allerdings schnell ermitteln, welche Kunden in letzter Zeit nicht mehr bestellt haben.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_012.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_012.png\" alt=\"&Uuml;bersicht der Kunden ohne Bestellung\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 10: &Uuml;bersicht der Kunden ohne Bestellung<\/p>\n<h2>Exists mit zus&auml;tzlichem Kriterium<\/h2>\n<p>Um also herauszufinden, welche Kunden beispielsweise noch keine Bestellung im Jahr 2023 get&auml;tigt haben, f&uuml;gen wir der Unterabfrage einfach ein zus&auml;tzliches Kriterium hinzu &#8211; eines das die Bestelldatens&auml;tze auf solche mit einem Datum in 2023 einschr&auml;nkt. Mehr zu Datumskriterien erf&auml;hrst Du im Artikel <b>Abfragen [basics]: Nach Datumsfeldern filtern <\/b>(<b>www.access-basics.de\/592<\/b>). Die neue Unterabfrage lautet:<\/p>\n<pre>Bestellung: Exists (\r\n      SELECT BestellungID      FROM tblBestellungen WHERE      tblBestellungen.KundeID = tblKunden.KundeID      AND Year(Bestelldatum) = 2023)<\/pre>\n<p>Damit liefert die Abfrage schon einige weitere Datens&auml;tze &#8211; und einen Ansatz, welchen Kunden man mal wieder ein Angebot machen k&ouml;nnte.<\/p>\n<h2>Bestimmte Menge Datens&auml;tze einer Gruppe <\/h2>\n<p>Vielleicht m&ouml;chtest Du mal die drei teuersten Artikel jeder Kategorie ermitteln. Wenn wir unabh&auml;ngig von der Kategorie die drei teuersten Artikel ermitteln wollen, nutzen wir eine absteigende Sortierung nach dem Feld <b>Einzelpreis <\/b>und stellen die Eigenschaft <b>Spitzenwerte <\/b>der Abfrage auf <b>3 <\/b>ein (siehe Bild 11).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_013.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_013.png\" alt=\"Ermitteln der teuersten drei Artikel\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 11: Ermitteln der teuersten drei Artikel<\/p>\n<p>Die drei teuersten Artikel einer bestimmten Kategorie k&ouml;nnen wir nun leicht ermitteln, indem wir in dieser Abfrage einfach das Feld <b>Kategorie-ID <\/b>plus ein entsprechendes Kriterium hinzuf&uuml;gen (siehe Bild 12).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_014.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_014.png\" alt=\"Die teuersten drei Artikel\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 12: Die teuersten drei Artikel<\/p>\n<p>Wenn wir aber in einem Abfrageergebnis wie Bild 13 in die drei teuersten Artikel einer jeden Kategorie ausgeben wollen, kommen wir so nicht weiter.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_015.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_015.png\" alt=\"Die teuersten drei Artikel je Kategorie\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 13: Die teuersten drei Artikel je Kategorie<\/p>\n<p>Die zum Ziel f&uuml;hrende Vorgehensweise sieht dann wie folgt aus: Wir erstellen eine Unterabfrage, die jeweils die <b>TOP 3 <\/b>Artikel absteigend sortiert nach dem Einzelpreis liefert und die ein Kriterium aufweist, nach dem die Kategorie der Kategorie des Datensatzes in der Hauptabfrage entspricht. Diese Unterabfrage liefert je nach Kategorie immer drei Datens&auml;tze der Artikel-Tabelle beziehungsweise die <b>ArtikelID <\/b>der jeweiligen Datens&auml;tze.<\/p>\n<p>F&uuml;r die Kategorie <b>Getr&auml;nke <\/b>liefert die Unterabfrage also beispielsweise so etwas: <b>38, 43, 2<\/b>. Da die Hauptabfrage das Feld <b>ArtikelID <\/b>nach diesen Werten filtert, erhalten wir das gew&uuml;nschte Ergebnis. Zus&auml;tzlich sortieren wir die Datens&auml;tze in der Hauptabfrage zuerst aufsteigend nach der Kategorie, damit wir die Datens&auml;tze der Kategorien zusammenh&auml;ngend sehen, und absteigend nach dem Einzelpreis.<\/p>\n<p>Der Clou ist, dass wir die Unterabfrage nicht einfach in Klammern als Kriterium angeben, sondern dass wir dieser das <b>In<\/b>-Schl&uuml;sselwort voranstellen. Das bewirkt, dass wir alle Datens&auml;tze erhalten, die von der Unterabfrage zur&uuml;ckgeliefert werden. Der Entwurf ist in Bild 14 dargestellt.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_016.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_016.png\" alt=\"Entwurf der Abfrage zum Ermitteln der teuersten drei Artikel je Kategorie\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 14: Entwurf der Abfrage zum Ermitteln der teuersten drei Artikel je Kategorie<\/p>\n<h2>Beispiel Duplikatsuche<\/h2>\n<p>Ein weiteres Beispiel, das wir uns anschauen wollen, haben wir in einem anderem Artikel namens <b>Abfragen [basics]: Duplikate per Assistent suchen<\/b> (<b>www.access-basics.de\/598<\/b>) mit dem Assistent f&uuml;r die Duplikatsuche erzeugt. Hier haben wir f&uuml;r eine Tabelle namens <b>tblAdressen <\/b>alle Datens&auml;tze ermittelt, deren E-Mail-Adresse in mehr als einem Datensatz vorkommt. Der Entwurf dieser Abfrage sieht wie in Bild 16 aus.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_001.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_001.png\" alt=\"Abfrage zum Finden von Duplikaten\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 15: Abfrage zum Finden von Duplikaten<\/p>\n<p>Die Unterabfrage nutzt diesmal eine Gruppierung nach dem Feld <b>EMail <\/b>und z&auml;hlt deren Anzahl. Mehr zum Thema Gruppierungen erf&auml;hrst Du im Artikel <b>Abfragen [basics]: Gruppierungen nutzen <\/b>(<b>www.access-basics.de\/593<\/b>).<\/p>\n<p>Diese Unterabfrage liefert eine Liste von E-Mails zur&uuml;ck, deren Anzahl in der Unterabfrage gr&ouml;&szlig;er als <b>1 <\/b>ist, die also mindestens doppelt vorkommen.<\/p>\n<p>Diese Liste wird wieder mit dem Schl&uuml;sselwort <b>In <\/b>als Kriterium des Feldes <b>EMail <\/b>der Hauptabfrage verwendet. Somit liefert die Abfrage als Ergebnis jeden einzelnen Datensatz, der eine der doppelten E-Mail-Adressen aus der Unterabfrage enth&auml;lt &#8211; was wiederum wie in Bild 15 aussieht.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_616_017.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_616_017.png\" alt=\"Das Ergebnis mit den doppelten E-Mail-Adressen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 16: Das Ergebnis mit den doppelten E-Mail-Adressen<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Artikel zeigt die Verwendung von Unterabfragen. Wie man Unterabfragen in Aktionsabfragen einsetzt, erl&auml;utern wir im Artikel <b>Abfragen [basics]: Aktionsabfragen <\/b>(<b>www.access-basics.de\/617<\/b>)<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>2302_AbfragenBasics_Unterabfragen.accdb<\/p>\n<p><a href=\"..\/Downloads\/Beispiele\/{5CB533F1-5E9B-4678-9EFC-01EB89B61529}\/AbfragenBasics_Unterabfragen.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Unterabfragen Was soll das nun wieder sein Ich kenne Unterformulare, aber Unterabfragen Nun: Unterabfragen sind ganz einfach Abfragen, deren Ergebnis als Kriterium in einer &uuml;bergeordneten Abfrage verwendet wird oder deren Ergebnis als Teil des Ergebnisses der Hauptabfrage ausgegeben werden soll. Dabei gibt es f&uuml;r Unterabfragen spezielle Vorgaben, zum Beispiel dass diese nur ein einziges Feld zur&uuml;ckliefern d&uuml;rfen (wobei das Feld auch eine Funktion eines Feldes sein kann wie eine Summe oder Anzahl). Wie genau man Unterabfragen definiert und wozu Du diese einsetzen kannst, zeige ich Dir in diesem Artikel.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022023,662023,44000006],"tags":[],"class_list":["post-55000616","post","type-post","status-publish","format-standard","hentry","category-66022023","category-662023","category-Abfragen_fuer_die_Datenauswahl"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Abfragen [basics]: Unterabfragen - Access [basics]<\/title>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Abfragen [basics]: Unterabfragen - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Unterabfragen Was soll das nun wieder sein Ich kenne Unterformulare, aber Unterabfragen Nun: Unterabfragen sind ganz einfach Abfragen, deren Ergebnis als Kriterium in einer &uuml;bergeordneten Abfrage verwendet wird oder deren Ergebnis als Teil des Ergebnisses der Hauptabfrage ausgegeben werden soll. Dabei gibt es f&uuml;r Unterabfragen spezielle Vorgaben, zum Beispiel dass diese nur ein einziges Feld zur&uuml;ckliefern d&uuml;rfen (wobei das Feld auch eine Funktion eines Feldes sein kann wie eine Summe oder Anzahl). Wie genau man Unterabfragen definiert und wozu Du diese einsetzen kannst, zeige ich Dir in diesem Artikel.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-01T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/fa71df63042648f099c57d91fd74fe7e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"10\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"http:\/\/vg07.met.vgwort.de\/na\/fa71df63042648f099c57d91fd74fe7e\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html\",\"name\":\"Abfragen [basics]: Unterabfragen - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html#primaryimage\"},\"datePublished\":\"2023-04-01T00:00:00+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_Unterabfragen.html\",\"name\":\"Abfragen [basics]: Unterabfragen\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000616","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000616"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000616\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000616"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}