Access SQL Abfrage

Hallo,
Ich muss mich auch einmal mit Access 2000-Abfrage (in SQL) an euch wenden:

Feld: bezeichnung, Typ Text(50)
(weitere Felder sind nicht wichtig)

Inhalt:
Aaaaaaaaaa Teil 1 aaaaa
Aaaaaaaaaa Teil 2
Aaaaaaaaaa Teil 3 aa
Bbb Teil 1
Cccccccc Teil 1
Cccccccc Teil 2 cc
Dddddd Teil 1

Frage:
Ich benötige als Ausgabe die vollständige Bezeichnung der Datensätze, wo es einen Teil 1, aber keine weiteren Datensätze zu gibt.

Ausgabe soll:
Bbb Teil 1
Dddddd Teil 1

Meine bisherige Lösung zeigt zwar alle entsprechenden Datensätze, aber leider nur die ersten 10 Zeichen meiner bezeichnung, der vollständige Inhalt würde mir viel weiter helfen.

SELECT Left(tblxxx.bezeichnung,10) AS Ausdr1
FROM tblxxx
WHERE (((tblxxx.bezeichnung) Like „*Teil*“))
GROUP BY Left(tblxxx.bezeichnung,10)
HAVING (((Count(Left([tblxxx].[bezeichnung],10)))=1));

Kann mir jemand von euch weiter helfen???
Gruß
Dieter C.

Hi,

tolle Datenbankstruktur hast du da gebastelt.
>/IRONIE>
Nun zur Lösung :

SELECT \*
FROM tbl\_test
WHERE mid(bezeichnung,1,INSTR(1,bezeichnung,"Teil")-1) IN (
SELECT mid(bezeichnung,1,INSTR(1,bezeichnung,"Teil")-1) AS Ausdr1
FROM tbl\_test
GROUP BY mid(bezeichnung,1,INSTR(1,bezeichnung,"Teil")-1)
HAVING COUNT(mid(bezeichnung,1,INSTR(1,bezeichnung,"Teil")-1))=1);

Gruß.Timo

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hy Timo,
wenn ich deine SQL ausführe, bekomme ich einen Fehlerhinweis:
„Ungültiger Proceduraufruf“
Wie schon geschrieben, ich arbeite unter Access 2000. Großes Fragezeichen?
Gruß Dieter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,
Ich muss mich auch einmal mit Access 2000-Abfrage (in SQL) an
euch wenden:

Wer will dich denn damit ärgern??? (*lol*)

Meine bisherige Lösung zeigt zwar alle entsprechenden
Datensätze, aber leider nur die ersten 10 Zeichen meiner
bezeichnung, der vollständige Inhalt würde mir viel weiter
helfen.

Wenn du bereits in der Abfrage den Ausdruck auf 10 Zeichen begrenzt, kann da nicht mehr kommen…

SELECT Left(tblxxx.bezeichnung,10) AS Ausdr1…

Nimm doch das komplette Feld noch mit in die Abfrage hinein.

SELECT tblxxx.bezeichnung, Left(tblxxx.bezeichnung,10) As Ausdr1
FROM tblxxx
WHERE (((tblxxx.bezeichnung) Like „*Teil*“))
GROUP BY Left(tblxxx.bezeichnung,10)
HAVING (((Count(Left([tblxxx].[bezeichnung],10)))=1));

Gruß
Dieter C.

HTH, Jan

Hallo,

Hi,

Ich muss mich auch einmal mit Access 2000-Abfrage (in SQL) an
euch wenden:

Wer will dich denn damit ärgern??? (*lol*)

Meine bisherige Lösung zeigt zwar alle entsprechenden
Datensätze, aber leider nur die ersten 10 Zeichen meiner
bezeichnung, der vollständige Inhalt würde mir viel weiter
helfen.

Wenn du bereits in der Abfrage den Ausdruck auf 10 Zeichen
begrenzt, kann da nicht mehr kommen…

SELECT Left(tblxxx.bezeichnung,10) AS Ausdr1…

Nimm doch das komplette Feld noch mit in die Abfrage hinein.

Wird nicht klappen, da der Ausdruck „tblxxx.bezeichnung“ nicht in der Group drinnen ist.

Gruß.Timo

SELECT tblxxx.bezeichnung, Left(tblxxx.bezeichnung,10) As
Ausdr1
FROM tblxxx
WHERE (((tblxxx.bezeichnung) Like „*Teil*“))
GROUP BY Left(tblxxx.bezeichnung,10)
HAVING (((Count(Left([tblxxx].[bezeichnung],10)))=1));

Gruß
Dieter C.

HTH, Jan

Hallo,
tja, genau an diesem Punkt hänge ich ja auch fest!?
Ich brauche das ganze Feld in der Ausgabe, kann aber nur nach einem Teilfeld gruppieren.
(Synchronisierte) Unterabfrage???
Gruß Dieter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

SELECT \* FROM DeineTabelle
WHERE Bezeichnung LIKE "\*Teil 1\*"
AND Bezeichnung NOT IN 
(SELECT Bezeichnung FROM DeineTabelle 
 WHERE Bezeichnung NOT LIKE "\*Teil 1\*")

Gruß aus dem Norden
Reinhard Kraasch

(http://www.dbwiki.de - das Datenbank-Wiki)

Hallo,
leider ist auch dieses Ergebnis nicht so, wie es sein sollte. Die Ausgabe sind ALLE Sätze mit „Teil 1“, auch von denen, wo es weitere Teile gibt (Teil 2 und/oder Teil 3). Es sollen aber NUR die Sätze angezeigt werden, wo nur Teil 1 (und KEINE weiteren) vorhanden ist.
Gruß Dieter C.
(ebenfalls aus dem Norden)

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Aber so:

  1. Schreib dir eine kleine Funktion:

    Public Function Splitz(S, Sep As String, N As Long)
    Dim x
    If IsNull(S) Then
    Splitz = Null
    Else
    x = Split(S, Sep)
    If N >= LBound(x) And N

    1. und dann:

      SELECT * FROM tblBezeichnung
      WHERE Bezeichnung LIKE „*Teil 1*“
      AND Splitz(Bezeichnung," „,0) NOT IN
      (SELECT Splitz(Bezeichnung,“ ",0) FROM tblBezeichnung
      WHERE Bezeichnung NOT LIKE „*Teil 1*“)

    … wobei es sicher allemal einfacher wäre, wenn du deine Tabellen- und Datenstruktur in Ordnung bringen würdest!

    Gruß aus dem Norden
    Reinhard Kraasch

    (http://www.dbwiki.de - das Datenbank-Wiki)

Hallo,
das ganze läuft so leider in einer Endlosschleife.
Zu deinem Hinweis, das es auf die Struktur ist sicherlich richtig, bei DBs, die ich selber erstelle, sind auch untersch. Informationen in getrennte Felder, so wie es die Normalisierung vorsieht. Aber leider gibt es in jedem Betrieb Datenbanken (Allgemein gesagt: Strukturen), die in einem langen Leben einer DB „gewachsen“ sind. Du weißt selbst, dass da im Regelfall mehrere DBs oder Tabellen u.ä. zusammenlaufen. Wenn du hier was änderst, hast dort das nächste Problem. Was machst du, du läßt den alten Kram, wie er ist und hoffst, das alles gut wird. Aber manchmal kommen dann eben mal so kleine Sonderfälle (Gott sei Dank, eher seltener). Ich denke, das kennst du aus deiner eigenen Praxis genauso. Aber nix für ungut. Hast du eine Lösung für mich???
Gruß Dieter aus Oldenburg

Aber so:

  1. Schreib dir eine kleine Funktion:

Public Function Splitz(S, Sep As String, N As Long)
Dim x
If IsNull(S) Then
Splitz = Null
Else
x = Split(S, Sep)
If N >= LBound(x) And N

  1. und dann:

SELECT * FROM tblBezeichnung
WHERE Bezeichnung LIKE „*Teil 1*“
AND Splitz(Bezeichnung," „,0) NOT IN
(SELECT Splitz(Bezeichnung,“ ",0) FROM tblBezeichnung
WHERE Bezeichnung NOT LIKE „*Teil 1*“)

… wobei es sich

er allemal einfacher wäre, wenn du deine

Tabellen- und Datenstruktur in Ordnung bringen würdest!

Gruß aus dem Norden
Reinhard Kraasch

(http://www.dbwiki.de - das Datenbank-Wiki)

Ich sehe da keine Schleife - insofern auch keine Endlosschleife…

Bei mir läuft’s, ggf. musst du noch ein bisschen debuggen, kann sein, dass ich nicht alle Sonderfälle abgefangen habe.

Gruß aus dem Norden
Reinhard Kraasch

(http://www.dbwiki.de - das Datenbank-Wiki)

1 Like

Es kann natürlich sein, dass die Angelegenheit sehr lahm wird - derartige Subselects sind nicht gerade effizient…

Wenn es um größere Datenmengen geht, bietet es sich an, erst mal die Daten aufzubereiten, d.h. in separate Felder aufzusplitten - und dann erst darüber die Abfragen laufen zu lassen.

Gruß aus dem Norden
Reinhard Kraasch

(http://www.dbwiki.de - das Datenbank-Wiki)

Hallo,
OK, hast recht, KEINE Schleife. Ich habe durch die unendlich lange Laufzeit verwirren lassen (immerhin etwa 11000 Datensätze, 490MB). Auch das Ergebnis ist RICHTIG. Vielen Dank!
Da diese Aktion nur noch höchstens 3x durchgeführt werden muss, ist die Laufzeit egal.
Noch einmal Danke.
Gruß Dieter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]