Select mit direkter Konstanteneingabe mehrzeilig



  • Hi,

    gibt es in Access Jet-SQL eine Möglichkeit, so wie man mit

    select 1 as Ziffer, 'eins' as Ziffernstring;
    

    eine einzeilige Tabelle simulieren kann auch eine Möglichkeit, wie man zu einer mehrzeiligen kommt, ohne dass eine physische Tabelle dahinter liegen muss?
    Vielen Dank im voraus

    Gruß Mümmel



  • Standard wäre UNION ALL. K.a. ob Access das kann

    select 1 as Ziffer, 'eins' as Ziffernstring
    UNION ALL
    select 2, 'zwei'
    UNION ALL
    select 3, 'drei'
    


  • Hi Hustbaer,

    das hatte ich auch schon versucht, aber das klappt eben so nur einzeilig.
    Bei mehrzeiligen Sachen wills immer ne Tabelle. Aber ich hatte ja gerade darauf gehofft, den Tabellenzugriff irgendwie weg zu "optimieren".
    Die Access-DB-Engine hat eben irgendwo doch ein wenig ihre Grenzen.
    Trotzdem vielen Dank.

    Gruß Mümmel



  • Hallo,

    JET verlangt leider nach einem FROM. Was versucht du denn zu machen?
    Wenn du dich in deiner Abfrage auf eine Tabelle beziehst, dann kannst du diese auch einfach an deine UNIONs hängen ohne dich auf eine vorhandene Spalte beziehen zu müssen.

    Grüße



  • @PREIST
    Meinst du

    select 1 as Ziffer, 'eins' as Ziffernstring FROM IrgendEineTabelle
    UNION ALL 
    select 2, 'zwei' FROM IrgendEineTabelle
    UNION ALL 
    select 3, 'drei' FROM IrgendEineTabelle
    

    ?

    Das wäre dann so pervers dass es schon wieder cool wäre.
    Ich würde mir dafür dann aber ne Dummy-Tabelle mit nem schön sprechenden Namen machen wo nie Zeilen drinnen sind.



  • Hi Hustbaer

    hustbaer schrieb:

    @PREIST
    Meinst du

    select 1 as Ziffer, 'eins' as Ziffernstring FROM IrgendEineTabelle
    UNION ALL 
    select 2, 'zwei' FROM IrgendEineTabelle
    UNION ALL 
    select 3, 'drei' FROM IrgendEineTabelle
    

    ?

    Das wäre dann so pervers dass es schon wieder cool wäre.
    Ich würde mir dafür dann aber ne Dummy-Tabelle mit nem schön sprechenden Namen machen wo nie Zeilen drinnen sind.

    Ganz so ginge es nicht, da dann für jede Zeile der Tabelle ein Datensatz angelegt würde, es sei denne, man sichert ab, dass wirklich nur eine Zeile in der Tabelle steht oder verwendet einen anderen Weg.
    Denkbar währe hier z.B.

    select top 1 1 as Ziffer, 'eins' as Ziffernstring FROM IrgendEineTabelle
    UNION ALL 
    select top 1 2, 'zwei' FROM IrgendEineTabelle
    UNION ALL 
    select top 1 3, 'drei' FROM IrgendEineTabelle
    

    oder

    select Max(1) as Ziffer, Max('eins') as Ziffernstring FROM IrgendEineTabelle
    UNION ALL 
    select Max(2), Max('zwei') FROM IrgendEineTabelle
    UNION ALL 
    select Max(3), Max('drei') FROM IrgendEineTabelle
    

    leider eliminiert mir das nicht wie eigentlich gewollt den direkten Tabellenzugriff.
    Werd ich wohl damit leben müssen, bleibt nur ebentuell noch ein entsprechend vorgefülltes TClientdataset. Aber ich glaube, da werfe ich mit der Wurst nach dem Schinken.

    Gruß Mümmel



  • hustbaer schrieb:

    @PREIST
    Meinst du
    ..

    yep :p,

    oder schaut euch diesen Link an (DUAL):
    http://stackoverflow.com/questions/7933518/table-less-union-query-in-ms-access-jet-ace

    ... aber ganz ohne ist mir nicht bekannt das es geht.
    Ich umgehe Access soweit es nur geht ;)! 👍



  • Hi PRIEST,

    Danke für den Klaps auf den Hinterkopf, manchmal ist man einfach betriebsblind, und übersieht beim Kopieren, das da ja union all steht.
    Ja, ohne all, nur mit union geht es.

    Die kleinen mdb-Datenbanken sind, soweit man sich auf die reine Datenbank beschränkt und auf Access an sich verzichtet gar nicht so schlecht.
    Wenn man über Jet und Ado zugreift, kommt man damit schon ganz gut zurecht.
    Klar, mit einem großen DB-System kommen sie nicht mit, und Multiuser sollte möglichst auch nicht. Aber sie stehen unter jedem Windows ab XP zur Verfügung, ohne dass Access vorhanden sein muss, und was das wichtigste für mich ist, man muss wirklich nichts dafür installieren.
    Und man hat den riesigen Vorteil,, dass man bei Bedarf über Access ein Reparatur und Wartungstool hat, mit dem man auch jede einzelne Tabelle und innerhalb der Tabellen jedes einzelne Feld problemlos mit einem Kommentar versehen kann.
    Wenn man darauf angewiesen ist, dass man das Programm einfach samt mdb nur irgendwohin kopieren muss und es dann beim schlimmsten Dau funktionieren muss, dann hilft das schon recht gut weiter.
    Irgendwohin kopieren ist meist bei vielen Nutzern das einzige, was man erwarten kann (meist ist irgendwohin dann im Endeffekt der Desktop auch wenn man ein anderes Ziel angegeben hat) und wenn es dann funktioniert, dann ist es erst mal ok.

    Gruß Mümmel



  • Hehe, cool wenn es jetzt klappt 🙂 👍

    Union frisst ja quasi die Duplikate weg, wenn es zuviel Daten sind, dann musst du mal die performance testen, nicht das es hier Einbußen gibt. 😋

    Und ja, da hast du schon recht ganz teuflisch ist das nicht 🙂 👍



  • Hi PRIEST,

    ja, es geht gut. Um unnötigen Overhead zu vermeiden hab ich dafür eine extra-Dummy-Tabelle angelegt, die nur eine Spalte mit einem SmallInt-Wert enthält.
    Kurioserweise ist das Ergebnis gleich, egal wie viele Zeilen die Tabelle enthält. Ist sie dagegen völlig leer, erhält man auch eine leere Ergebnismenge, auch wenn man gar keinen Bezug auf die Zeilenzahl nimmt.
    Vielleicht kann man das ja ggf. auch noch für irgendwelche Steuerzwecke verwenden.
    Dadurch dass ich da nur eine einzige Dummy-Tabelle verwende, hält sich auch der Aufwand in der Datenbank in Grenzen, und ich gehe davon aus, das das der optimale Weg unter Jet-SQL ist.
    Ich hatte eben gehofft, das man wie bei Transakt-SQL mehrzeilege Angaben machen kann, wo z.B. solche Syntax (hier bei insert) machbar ist:

    INSERT INTO Production.UnitMeasure
    VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'), (N'Y3', N'Cubic Yards', '20080923');
    

    Gruß Mümmel



  • 🙂 👍 Ja, schön wäre es wenn das möglich wäre!

    Falls jemand diesen Beitrag liest und nicht weiß wo der Unterschied zwischen UNION und UNION ALL ist.

    UNION ALL gibt alle werte einer Tabelle zurück, auch Duplikate.
    UNION filter Duplikate heraus, quasi wie ein SELECT DISTINCT.

    (Tabelle1 hat 3 Einträge.)

    SELECT "Value" as Field1
    FROM Tabelle1;
    UNION
    SELECT "Value2" as Field1
    FROM Tabelle1;
    

    Output 2 Rows; "Value" + "Value2"

    gibt das selbe aus wie

    SELECT DISTINCT "Value" as Field1
    FROM Tabelle1;
    UNION ALL
    SELECT DISTINCT "Value2" as Field1
    FROM Tabelle1;
    

    Output 2 Rows; "Value" + "Value2"

    SELECT "Value" as Field1
    FROM Tabelle1;
    UNION ALL
    SELECT "Value2" as Field1
    FROM Tabelle1;
    

    Output 6 Rows; 3x "Value" + 3x "Value2"



  • Wichtig:
    Der Output von

    `SELECT DISTINCT ...

    UNION ALL

    SELECT DISTINCT ...`

    ist hier nur deswegen identisch zum Output von

    `SELECT ...

    UNION

    SELECT ...`

    weil die Ergebnisse der beiden SELECT s sich nicht überschneiden.

    UNION (ohne ALL) ist generell eher vergleichbar mit

    `SELECT DISTINCT * FROM

    (

    SELECT ...
    
    UNION ALL
    
    SELECT ...
    

    )`



  • @hustbaer Naja... eher ein SQL-Schluckauf dein "Generell"

    Der Vergleich auf das genannte Beispiel passt doch...



  • Ich kann den Sinn hinter deinem Kommentar nicht erkennen.



  • Gehupft wie gesprungen 😉

    Um den Unterschied zu erklären habe ich es lieber aufgedröselt. 🙂
    Aber Ergänzungen sind immer gut.

    Greetings


Log in to reply