Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst SQL,Access: Mehrere Tabellen mit gleicher Struktur bzw. Spalten zusammenführen

Mitglied: PSaR04

PSaR04 (Level 1) - Jetzt verbinden

04.07.2014 um 23:36 Uhr, 7483 Aufrufe, 5 Kommentare

Hallo,

ich habe eine zugegebener Weise nicht so tolle Access Datenbank bekommen, aus der ich Daten rausziehen muss. In der DB gibt es Tabellen, die DatenXX heißen. XX steht hierbei für die Kurzform von Jahreszahlen (das sollte wohl der Übersichtlichkeit dienen). Die Tabellen haben ansonsten alle die gleiche Struktur bzw. Spaltenbezeichnungen. Eine Spalte heißt jahrgang und ich benötige nun alle Datensätze, bei denen das Feld "jahrgang" leer ist. Für eine einzelne Tabelle ist das ja recht schnell gemacht, ich benötige die Datensätze nun aber aus allen Tabellen bei denen jahrgang leer. Die entsprechenden Datensätze aus allen Tabellen sollen in der Ausgabe dann einfach untereinander geschrieben werden.
Bei zwei Tabellen würde ich das einfach so machen:
01.
SELECT * FROM (SELECT * FROM Daten00 UNION ALL SELECT * FROM Daten01) WHERE jahrgang is null;
Doch was ist die eleganteste Möglichkeit die Datensätze aus allen Tabellen (Daten00 - Daten99) zusammenzuführen? 98 UNIONs? Da meckert Access garantiert, dass die Abfrage zu komplex ist. Gibt es eine Möglichkeit mit einem Range-Operator oder so zu arbeiten, der mir nicht bekannt ist? Also z. B. SELECT * FROM RANGE Daten$XX (00,99,1) WHERE....

Ich freue mich auf eure Tipps.

Grüße
PSaR04
Mitglied: colinardo
LÖSUNG 05.07.2014, aktualisiert um 18:00 Uhr
Hallo PSaR04,
mit VBA hätte ich dafür eine Lösung. Es fasst alle deine gewünschten Daten in einer neu erstellten Tabelle zusammen, und öffnet diese zum Schluss.
01.
Sub MergeTablesIntoOne() 
02.
    Dim rsAll As Recordset, rsCurrent As Recordset, tblName as String, c as integer, i as integer    
03.
    DoCmd.SetWarnings False 
04.
    ' passende Datensätze aus Daten00 in neue Tabelle schreiben 
05.
    DoCmd.RunSQL "Select * into DataResult from Daten00 where jahrgang is null" 
06.
    DoCmd.SetWarnings True 
07.
    ' neue Tabelle öffnen 
08.
    Set rsAll = CurrentDb.OpenRecordset("Select * From DataResult", dbOpenDynaset) 
09.
    Set db = CurrentDb 
10.
    ' Für alle passenden Tabellen 
11.
    For i = 1 To 99 
12.
        tblName = "Daten" & Right("0" & i, 2) 
13.
        Set rsCurrent = db.OpenRecordset("Select * From " & tblName & " where jahrgang is null", dbOpenSnapshot) 
14.
        rsCurrent.MoveFirst 
15.
        While Not rsCurrent.EOF 
16.
            rsAll.AddNew 
17.
            For c = 0 To rsAll.Fields.Count - 1 
18.
                rsAll.Fields(c).Value = rsCurrent.Fields(c).Value 
19.
            Next 
20.
            rsAll.Update 
21.
            rsCurrent.MoveNext 
22.
        Wend 
23.
    Next 
24.
    ' neu erstellte Tabelle anzeigen 
25.
    DoCmd.OpenTable "DataResult" 
26.
End Sub
Grüße Uwe
Bitte warten ..
Mitglied: PSaR04
05.07.2014 um 17:55 Uhr
Hallo colinardo!

Vielen Dank für den Programmcode, ich hatte gar nicht mit einer so ausführlichen Lösung gerechnet. Das hat mir bestimmt 2 Stunden Arbeit gespart, da ich mit VBA bisher noch nicht so viel gemacht habe.
Anhand der doch relativ aufwendigen Lösung gehe ich dann davon aus, dass sich die gewünschte Abfrage nicht einfacher realisieren lässt (etwa über einen mir unbekannten Operater oder ähnlichem, wie im ersten Post von mir gehofft)?!?
Ich musste deinen Quellcode nur noch an 2 Stellen etwas anpassen, da es zu Fehlern gekommen ist.
1. Bei der Deklaration der Recordsets rsAll und rsCurrent musste ich den Datentyp von "Recordset" auf "DAO.Recordset" ändern. Da es sonst zur Fehlermeldung "Typen unverträglich" kam.
2. Einige der Tabellen sind leer, daher musste ich noch ein "If Not rsCurrent.RecordCount = 0 Then..." ergänzen.

Hier der komplette Quellcode:
01.
Sub MergeTablesIntoOne() 
02.
    Dim rsAll As DAO.Recordset, rsCurrent As DAO.Recordset, tblName as String, c as integer, i as integer    
03.
    DoCmd.SetWarnings False 
04.
    ' passende Datensätze aus Daten00 in neue Tabelle schreiben 
05.
    DoCmd.RunSQL "Select * into DataResult from Daten00 where jahrgang is null" 
06.
    DoCmd.SetWarnings True 
07.
    ' neue Tabelle öffnen 
08.
    Set rsAll = CurrentDb.OpenRecordset("Select * From DataResult", dbOpenDynaset) 
09.
    Set db = CurrentDb 
10.
    ' Für alle passenden Tabellen 
11.
    For i = 1 To 99 
12.
        tblName = "Daten" & Right("0" & i, 2) 
13.
        Set rsCurrent = db.OpenRecordset("Select * From " & tblName & " where jahrgang is null", dbOpenSnapshot) 
14.
        If Not rsCurrent.RecordCount = 0 Then 
15.
            rsCurrent.MoveFirst 
16.
            While Not rsCurrent.EOF 
17.
                rsAll.AddNew 
18.
                For c = 0 To rsAll.Fields.Count - 1 
19.
                    rsAll.Fields(c).Value = rsCurrent.Fields(c).Value 
20.
                Next 
21.
                rsAll.Update 
22.
                rsCurrent.MoveNext 
23.
            Wend 
24.
        End If 
25.
    Next 
26.
    ' neu erstellte Tabelle anzeigen 
27.
    DoCmd.OpenTable "DataResult" 
28.
End Sub
Vielen Dank nochmal.
PSaR04
Bitte warten ..
Mitglied: colinardo
05.07.2014, aktualisiert um 18:15 Uhr
1. Bei der Deklaration der Recordsets rsAll und rsCurrent musste ich den Datentyp von "Recordset" auf "DAO.Recordset" ändern. Da es sonst zur Fehlermeldung "Typen unverträglich" kam.
OK, dann handelt es sich vermultich um eine ältere Access Datenbank. In neueren ist ADO Standard.

Anhand der doch relativ aufwendigen Lösung gehe ich dann davon aus, dass sich die gewünschte Abfrage nicht einfacher realisieren lässt (etwa über einen mir unbekannten Operater oder ähnlichem, wie im ersten Post von
Wart mal ab vielleicht hat der @Biber da eventuell noch eine Lösung für eine reine SQL Abfrage.

Grüße Uwe
Bitte warten ..
Mitglied: Biber
LÖSUNG 05.07.2014, aktualisiert 06.07.2014
Moin PSaR04 und colinardo,

um die Zweifel auszuräumen:
- es existiert weder in Access-SQL noch einem anderem SQL-Dialekt etwas wie "Mach mir einen UNION über Tabelle 1...n"
- wie PSaR04 schon richtig vermutete - Access würde bei 99 Tabellen in einer Query auch bedauernd abwinken, da bei 32 offenen Tabellen in einer Query Schicht ist (Okay, ist an dieser Stelle mal kein Vorwurf an die PraktikantInnen. Wenn mehr als 32 Tabellen in einer Query verbaut werden müssen, dann ist das Datenbankdesign marode, so wie ja auch in dieser "Ich mach ma' 100 Tabellen, weil ich 100 Jahre verwalten will"-Musterlösung).


Einziger Verbesserungsvorschlag, den ich zum Skript anbringen würde:

Ich würde sicherheitshalber ein Feld mehr ins Resultset übernehmen, damit ich weiss, aus welcher Tabelle der Satz stammt.
Also statt
Set rsCurrent = db.OpenRecordset("Select * From " & tblName & " where jahrgang is null",

etwa so
Set rsCurrent = db.OpenRecordset("Select ' " & tblname & " ' as Tbname, t.* From " & tblName &" as t where jahrgang is null",


Falls die Abfragen auf die 99 Tabellen noch auf andere Fragestellungen modifiziert werden sollen:

Dann würde ich die Daten aus den Tabellen 1..99 nicht nur jetzt einmalig in einen Resultset schaufeln, sondern gleich- wenn ich eh' alle Tabellen durchwackeln muss- den ganzen Quatsch in eine neue Tabelle schreiben. Mit allen Sätzen, ohne einschränkendes WHERE.

Und eben mit einem Zusatzfeld, in dem der Quelltabellenname steht.

Grüße
Biber
Bitte warten ..
Mitglied: PSaR04
06.07.2014 um 16:59 Uhr
Zitate von colinardo:

OK, dann handelt es sich vermultich um eine ältere Access Datenbank. In neueren ist ADO Standard.
Ja, es handelt sich um eine Datenbank, die glaube ich unter Access 2000 entwickelt wurde.


Zitate von Biber:
- es existiert weder in Access-SQL noch einem anderem SQL-Dialekt etwas wie "Mach mir einen UNION über Tabelle 1...n"
Ok, danke für die Bestätigung. Ich konnte mir das auch fast nicht vorstellen, da ich trotz intensiver Suche nichts dazu gefunden habe, aber gut jetzt Gewissheit zu haben.

Wenn mehr als 32 Tabellen in einer Query verbaut werden müssen, dann ist das Datenbankdesign marode, so wie ja auch in dieser "Ich mach ma' 100 Tabellen, weil ich 100 Jahre verwalten will"-Musterlösung).
Da stimme ich dir voll und ganz zu. Die DB soll jetzt auch schnellstmöglich abgelöst werden, hat schon genug Nerven gekostet. Es handelt sich bei der benötigten Abfrage schon um eine vorbereitende Maßnahme dafür.

Ich würde sicherheitshalber ein Feld mehr ins Resultset übernehmen, damit ich weiss, aus welcher Tabelle der Satz stammt.
Ja, daran hatte ich auch schon gedacht, bisher ist das aber nicht wichtig. Aber gut, dass du die Lösung dafür schon gleich gepostet hast, kann ich bestimmt noch gebrauchen.
Dann würde ich die Daten aus den Tabellen 1..99 nicht nur jetzt einmalig in einen Resultset schaufeln, sondern gleich- wenn ich eh' alle Tabellen durchwackeln muss- den ganzen Quatsch in eine neue Tabelle schreiben. Mit allen Sätzen, ohne einschränkendes WHERE.
Wenn noch mehr Abfragen notwendig werden, mache ich das. Bisher ist das aber noch nicht abzusehen.


Vielen Dank, ihr habt mir sehr weitergeholfen!
PSaR04
Bitte warten ..
Ähnliche Inhalte
Datenbanken
SQL - Zwei Tabellen zusammenführen
gelöst Frage von Memo66Datenbanken6 Kommentare

Hallo, ich bin dabei SQL zu lernen und habe mir dazu eine Fußballdatenbank angelegt. Ich habe nun folgendes Problem ...

Datenbanken

SQL: Inhalte aus einer Spalte mit den Inhalten aus mehreren Spalten einer zweiten Tabelle vergleichen

gelöst Frage von sqlbeginnerDatenbanken4 Kommentare

Guten Tag ich habe folgende Fragen Frage 1: Tabelle1 , Spalte A in dieser stehen Kürzel Tabelle2, Spalte A, ...

Datenbanken

SQL Abfrage aus mehreren Tabellen

gelöst Frage von el-torontoDatenbanken2 Kommentare

Hallo, auf dem Bild die vereinfachte Darstellung. Problematik: - Tabelle 1 enthält hunderte Kunden und wird mit Werten und ...

Datenbanken

MySQL zwei Tabellen zusammenführen

gelöst Frage von RedBullmachtfitDatenbanken10 Kommentare

Hallo, ich habe in MySQL eine Artikel-Tabelle in welcher alle Artikel gespeichert sind sowie eine art_preise-Tabelle, in welcher nur ...

Neue Wissensbeiträge
Windows 10

Microcode-Updates KB4090007, KB4091663, KB4091664, KB4091666 für Windows 10

Information von kgborn vor 2 StundenWindows 101 Kommentar

Kurze Information für Administratoren von Windows 10-Systemen, die mit neueren Intel CPUs laufen. Microsoft hat zum 23. April 2018 ...

iOS
Updates für Iphone und Co
Information von sabines vor 5 StundeniOS

Gestern abend ist iOS 11.3.1 erschienen, ein kleineres Update, dass einige Lücken schließt und "Lahmlegen" nach einem Display Tausch ...

Windows 7

Windows 7 - Server 2008 R2: Exploit für Total Meltdown verfügbar

Information von kgborn vor 1 TagWindows 7

Kleine Information für Administratoren, die für die Updates von Windows 7 SP1 und Windows Server 2008 R2 SP1 verantwortlich ...

Sicherheit

Zero Day-Schwachstelle im Internet Explorer - wird von APT bereits ausgenutzt

Information von kgborn vor 2 TagenSicherheit

Im Kernel des Internet Explorer scheint es eine Zero Day-Lücke zu geben, die von staatlichen Akteuren (APT) im Rahmen ...

Heiß diskutierte Inhalte
C und C++
Frage1 C Programmierung-Makefile Frage2 PHP-Programmierung HTTP-Fehler 404
Frage von KatalinaC und C++28 Kommentare

Hallo, ich habe 2 Fragen, die nichts miteinander zu tun haben aber mit denen ich mich gerade beschäftige: 1. ...

LAN, WAN, Wireless
Watchguard T15 VPN Einrichtung
gelöst Frage von thomasjayLAN, WAN, Wireless25 Kommentare

Hallo zusammen, wir möchten gerne über unsere Watchguard T15 einen VPN-Tunnel (Mobile VPN with IPSec) einrichten! Als Client nutzen ...

Windows 10
Unter Windows 10 Home 64Bit (1709) kommt Fehler beim Aufruf von verschiedenen Systemprogrammen wie z.B. Gerätemanager
Frage von bitshopWindows 1017 Kommentare

Hallo, beim meinem Onkel haben wir seit längerem das Problem, dass z.B. beim Aufruf des Gerätemanagers eine Fehlermeldung kommt ...

Hyper-V
HyperV DC + DNS + AC
gelöst Frage von HardstylesHyper-V16 Kommentare

Hallo kann mir jemand sagen wieso meine Domänen Computer kein Internetzugang erhalten? Ich hab hier ein Server wo die ...