Hallo zusammen,
Leider bin ich in Access nicht ganz fit......besser gesagt, ich fange erst gerade an mich damit auseinander zu setzen.
Vielleicht kann mir der eine oder andere bei meinen kleinen Problemen weiterhelfen.
Ich muss in meinem Studium eine Hausübung abliefern, in der ich eine Datenbank anlegen muss.
Nichts wildes, aber für mir wirklich ein riesen Brocken.
Nun zu meinem Problem.
Ich habe eine Tabelle "tab_Tage" diese ist datiert vom 1.1.2010 bis zum 30.12.2011.
Mittels einer Löschabfrage, habe ich nun schon alle Samstage und Sonntage aus dieser Tabelle gelöscht.
Aber ich habe noch eine weitere Tabelle "tab_Feiertage", in der alle Feiertage von 1.1.2010 bis zum 30.12.2011 aufgeführt sind.
Nun möchte ich eine Löschabfrage durchführen, die alle Feiertagsdaten aus "tab_Feiertage" in "tab_Tage" löscht.
Wie bewerkstellige ich das nun?
Kann mir bitte jemand weiter helfen.
Ich nutze Office 2010 , wenn das von Interesse sein sollte.
Viele Grüße,
logicy
DELETE tab_Tage
WHERE Datumsfeld IN
(SELECT Datumswert FROM tab_Feiertage)
In der Praxis würde man das aber nicht tun, weil man ziemlich oft eine vollständige(!) Datumstabelle vorteilhaft verwenden kann und daher vorhalten wird.
Die gewünschte "Tabelle" würde man besser als Abfrage erzeugen, verkürzt etwa
SELECT T.Datumsfeld
FROM tab_TageVollstaendig AS T
WHERE Weekday(T.Datumsfeld, 2) < 6
AND NOT EXISTS
(SELECT Null FROM tab_Feiertage AS F
WHERE F.Datumsfeld = T.Datumsfeld)
MfGA
ebs
Hallo ebs, vielen dank für deine Antwort.
Leider komme ich trotzdem nicht voran.
Wo liegt der Fehler?
Ist das ein SQL Code oder ist das eie Eingabe in der Zeile Kriterium?
Viele Grüße,
Logicy
Hallo,
da ebs nicht online ist antworte ich.
Das ist ein SQL-String.
Mache eine neue Abfrage.
Zeige dies in der SQL-Ansicht an.
Kopiere den ersten Code von ebs hinein.
Den musst du eventuell noch auf deine Gegebenheiten anpassen (konnte den Code natürlich nicht testen).
Gruß
Johann
Hi vielen dank,
Habe aber noch einige Fragen zu dem Code.
Bitte nicht lachen, aber das ist für mich absolutes Neuland.
Ich habe hinter jeder Zeile geschrieben, was ich nicht verstehe.
SELECT T.Datumsfeld Steht das T. für "Tabelle"? und als Datumsfeld, gebe ich die Spaltenbezeichnung an?
FROM tab_TageVollstaendig AS T (Wofür steht in dieser Zeile das "T"?
WHERE Weekday(T.Datumsfeld, 2) < 6
AND NOT EXISTS
(SELECT Null FROM tab_Feiertage AS F Wofür steht in dieser tZeile das "F"?
WHERE F.Datumsfeld = T.Datumsfeld)
Hallo,
'T' steht als Alias für den langen Tabellennamen 'tab_TageVollstaendig ' - mit AS T wird T als Alias für den Tabellennamen bestimmt
'F' steht als Alias für den langen Tabellennamen 'tab_Feiertage' - wie oben
das fördert die Lesbarkeit und die Übersichtlichkeit ;)
Pseudefeldnamen in Beispielcodes sind natürlich durch die realen Spaltenbezeichnungen in deinen Tabellen zu ersetzen (Datumsfeld).
HTH
Ich habe euch mal die 2 Tabellen als Bilder angehangen.
Könnte da evtl. mal eine drüber schauen?
Stimmt der von mir angepasste Code?
SELECT tab_Tage.Datum
FROM tab_Tage AS tab_Tage
WHERE Weekday (tab_Tage.Datum, 2) < 6
AND NOT EXISTS
(SELECT Null FROM tab_Feiertage AS tab_Feiertage
WHERE tab_feiertage.Datum = tab_Tage.Datum)
[Anhang gelöscht durch Administrator]
Hi,
ja, die Abfrage paßt so.
wenn du diese ausführst bekommst du als Ergebnis alle Datens#tze der Tabelle 'tab_tage' OHNE die Feiertage aus der 'tab_Feiertage' ANGEZEIGT.
Was ebs in seiner Antwort gemeit hat ist, dass man nicht unbedingt Datensätze aus einer bestehenden Tabelle löschen SOLLTE,
da es sein kann, dass die gelöschten Einträge irgendwann für andere Zwecke benötigt werden KÖNNTEN.
Daher KANN man - wie mit dem angeführten SQL-Konstrukt - auszuschließende Daten ausblenden OHNE dass dabei gelöscht wird.
Wenn du aber dennoch unwiederbringlich löschen willst oder mußt, dann ersetze in der Abfrage das Schlüsselwort 'SELECT' durch 'DELETE'
Access wird dann die Daten aus der Tabelle tab_tage entfernen - du kannst das aber nicht mehr rückgängig machen!!
Wenn du Aliase (durch AS bezeichnet) im SQL-Code verwendest, macht es recht wenig Sinn die vollständigen Tabellennamen trotzdem vor die Feldbezeichnungen zu schreiben ;)
Also ...
SELECT T.Datum
FROM tab_Tage AS T
WHERE Weekday T.Datum, 2) < 6
AND NOT EXISTS
(SELECT Null FROM tab_Feiertage AS F
WHERE F.Datum = T.Datum)
HTH
Als Ergänzung:
Die Tabelle tab_Tage sollte etwas anders aussehen. Per Formatierung zeigst Du u.a. den Wochentagsnamen an. Das ist brotlos, weil in einer aufbauenden Abfrage oder in einem Formular nicht direkt nutzbar. Da müsstest Du erneut formatieren.
Effektiver wäre die Kalendertabelle, wenn eine Spalte das fortlaufende Datum und weitere Spalten (je nach Bedarf) aus dem Datum berechnete Abgaben wie Wochentagsnummer, Kalenderwoche, Quartal, Jahr, Monat, JJJJMM u.a. (jede Spalte indiziert!) enthält.
Daher müsste ein Ausdruck wie ...
WHERE Weekday(T.Datum, 2) < 6
... in einer wirklichen Abfrage nicht mehr vorkommen (keine Indexnutzung und damit verschenkte mögliche Performance), sondern man könnte sich die Wochentagsnummer per Verknüpfung über das Datum in die Abfrage hereinholen und dann mit Indexnutzung filtern, gruppieren, aggregieren, sortieren.
Zur pauschalen Verdeutlichung: Nutzung eines Index gegenüber Nichtnutzung kann einen Faktor bei der benötigten Zeit für eine Abfrageausführung von vielleicht 2, aber durchaus auch 5000 oder mehr ausmachen, und ob eine Abfrage dann 1 Sekunde oder 5000 Sekunden (83 Minuten!) dauert, ist dann selten egal.
MfGA
ebs
Zunächst einmal vielen Dank für eure schnelle Hilfe.
Wenn ich nun eine Abfrage erstelle, in die SQL-Ansicht wechsle und den Code eingebe:
SELECT T.Datum
FROM tab_Tage AS T
WHERE Weekday T.Datum, 2) < 6
AND NOT EXISTS
(SELECT Null FROM tab_Feiertage AS F
WHERE F.Datum = T.Datum)
bekomme ich immer eine Fehlermeldung: "Syntaxfehler"!
Muss ich vorher noch die Tabellen in der Entwurfsansicht einfügen...ich dachte eigentlich nicht?!
Hat evtl. jemand einen guten Rat :-D
SELECT T.Datum
FROM tab_Tage AS T
WHERE Weekday (T.Datum, 2) < 6
AND NOT EXISTS
(SELECT Null FROM tab_Feiertage AS F
WHERE F.Datum = T.Datum)
Danke,
aber nun gibt es ein Problem.
Der Code hat nun dazu geführt, dass er alle Tage AUßER DEN FEIERTAGEN, in der tab_Tage gelöscht hat!!!!
Er sollte aber ALLE FEIERTAGE aus tab_Tage löschen!
Ich habe natürlich vor der Durchführung der Löschabfrage die Datenbank ein weiteres mal gesichert.
Wie muss ich den Code nun abändern?
ZitatDer Code hat nun dazu geführt ...
Nee, Auswahlabfragen löschen nicht, sondern zeigen nur an.
Erstens hatte ich ganz oben eine Löschabfrage gezeigt. Übersehen?
Ansonsten, wenn Du die Auswahlabfrage als Basis für die Löschabfrage hernehmen willst: Es reicht nicht, per Knöpfchen die Abfrage umzustellen.
Die Auswahlabfrage zeigt, was man sehen (= behalten) will. Will man löschen, muss man entsprechend die Logik umkehren.
=> NOT entfällt, aus "<" wird ">="
MfGA
ebs
Hallo ebs,
das funktioniert leider nicht.
=> NOT entfällt, aus "<" wird ">="
Wie wäre denn die von dir erstellte Löschabfrage abzuändern?
So?
DELETE tab_Tage
WHERE Datum IN
(SELECT Datumswert FROM tab_Feiertage)
Ich bekomme immer einen Syntaxfehler?
Wofür steht die Bezeichnung "Datumswert"?
Zitatdas funktioniert leider nicht
Oh doch, das funktioniert.
Du solltest präziser formulieren, dass es bei Dir nicht funktioniert.
ZitatWofür steht die Bezeichnung "Datumswert"?
Was hältst Du denn z.B. von der Feldbezeichnung des Datumsfeldes in dieser Tabelle?
Da Du die reale Bezeichnung nicht angegeben hattest und schon rein aus Übungszwecken (etwas Nachdenken muss sein) habe ich eine beliebige Bezeichnung gewählt, die sich aber gewollt von dem reservierten Wort "Datum" unterscheidet. Du müsstest eine solche Bezeichnung durch eine eigene ersetzen, die dann am besten auch den üblichen Namenskonventionen entspricht.
Den Hinweis, dass Bezeichnungen anzupassen sind, hattest Du oben schon bekommen.
MfGA
ebs
Vielen Dank erstmal....ich werde es heute abend zuhause nochmal versuchen.