Tabellenlose UNION-Abfrage in MS Access (Jet / ACE)
Dies funktioniert wie erwartet:
SELECT "Mike" AS FName
Dieser schlägt mit der Fehlermeldung "Query-input, muss mindestens eine Tabelle oder Abfrage":
SELECT "Mike" AS FName
UNION ALL
SELECT "John" AS FName
Ist dies nur eine Besonderheit/Einschränkung der Jet/ACE-Datenbank-engine oder bin ich etwas fehlt?
Kommentar zu dem Problem - Öffnen
Das ist auch das, was ich gefunden haben, aber Sie können wählen aus einer Zeile einer Tabelle als work-around, oder wählen Sie unterscheidet sich von einer Tabelle.
Ja, ich halte eine lokale Dummy-Tabelle mit 1 Feld-und 1 record-und verwenden Sie es wie Sie vorschlagen. Es ist einfach etwas, das immer mild, hat mich genervt und ich wollte sicherstellen, dass ich war nicht etwas fehlt einfach.
Ich habe noch nie persönlich gesehen, keine Dokumentation, auch auf der MSDN-Website in Bezug auf diese, wie du bereits erwähnt hast, diese zu umgehen verwenden Sie den Namen einer vorhandenen Tabelle.
InformationsquelleAutor der Frage mwolfe02 | 2011-10-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du nicht übersehen nichts. Access' Datenbank-engine ermöglichen eine einzelne Zeile
SELECT
ohneFROM
Datenquelle. Aber wenn Sie wollenUNION
oderUNION ALL
mehrere Zeilen, müssen Sie eineFROM
... auch wenn Sie nicht verweisen auf ein Feld aus der Datenquelle.Erstellte ich eine Tabelle mit einer Zeile und fügte hinzu, eine check-Einschränkung zu garantieren, wird es immer eine und nur eine Zeile.
Dass
Dual
Tabelle ist nützlich für Anfragen wie diese:Anderen Ansatz, den ich gesehen habe ist die Verwendung einer
SELECT
- Anweisung mitTOP 1
oder eineWHERE
- Klausel beschränkt das Ergebnis auf eine einzelne Zeile.Hinweis: check-Einschränkungen Hinzugefügt wurden, mit Jet 4 und sind nur für ausgeführte Anweisungen von ADO.
CurrentProject.Connection.Execute strSql
funktioniert, weilCurrentProject.Connection
ist ein ADO-Objekt. Wenn Sie versuchen, führen Sie die gleiche Aussage mit DAO (ieCurrentDb.Execute
oder aus der Access-Abfrage-designer), erhalten Sie einen Syntaxfehler, weil DAO nicht erstellen von check-Einschränkungen.InformationsquelleAutor der Antwort HansUp
Wenn Sie Zugriff auf einige system-Tabellen, können Sie emulieren eine dual Tabelle so:
Leider, ich bin mir nicht bewusst, irgendwelche system-Tabellen,...
DUAL
oder DB2 istSYSIBM.DUAL
Also würden Sie schreiben:
Dies ist, was wird umgesetzt, wie eine syntaktische element in jOOQ, zum Beispiel.
InformationsquelleAutor der Antwort Lukas Eder
Wenn Sie haben beschränkt, nur-lese-Zugriff auf die Datenbank (ich.e Sie können nicht erstellen Sie neue Tabellen oder access-system-Ressourcen), dies könnte funktionieren:
anyTable ist der erste user-Tabelle, die Sie finden (kann ich mir kaum vorstellen in einer realen Datenbank mit Benutzer keine Tabelle!).
WHERE 1=0 ist zurückgeben sollte, schnell eine Anzahl von 0, selbst auf einem großen Tisch (hoffentlich ist die Jet-engine ist schlau genug, zu erkennen, diese triviale Bedingung).
InformationsquelleAutor der Antwort Cristi S.
Wenn jemand will das Top-1-Methode, würde es so Aussehen:
Den alias für das Feld muss identisch sein auf beiden Seiten von der union, in diesem Fall "FName".
InformationsquelleAutor der Antwort guest
Hier ist eine viel einfachere Weg, es zu tun:
Wichtig: TableWith1Row kann ENTWEDER eine Tabelle mit buchstäblich 1 Datensatz (die Sie sowieso ignorieren), ODER es kann eine Tabelle mit einer beliebigen Anzahl von Zeilen (es muss MINDESTENS 1 Zeile), aber Sie fügen Sie eine WHERE-Klausel, um sicherzustellen, 1 Zeile. Das ist ein bisschen loosy-goosy aber es ist ein schneller Weg, um diese Arbeit zu machen ohne die Schaffung von mehr-Tabellen.
InformationsquelleAutor der Antwort HerrimanCoder