Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

SQL - IN und LIKE '%' verschachteln möglich?

Begonnen von Kloso, November 02, 2016, 08:40:01

⏪ vorheriges - nächstes ⏩

Kloso

Hallo,

habe folgenden Code: (er funktioniert wunderbar)

SELECT *
FROM Tabelle
WHERE Spalte_1 IN (SELECT Spalte_x FROM Tabelle_2);


Er zeigt mir nur die Zeilen der Spalte_1 die mit der Spalte_x übereinstimmen.
Problem: Er macht es 1 zu 1. Ich möchte aber nun LIKE '%' .... '%' hinzufügen. Sodass es auch in der mitte des Feldes die Übereinstimmung erkennt.

Habe es so probiert:

SELECT *
FROM Tabelle
WHERE Spalte_1 Like '%' + (IN (SELECT Spalte_x FROM Tabelle_2)) + '%';


leider war es nicht ganz korrekt.

Gibt es einen anderen Ansatz?


Viele Grüße Kloso

DF6GL

Hallo,

etwa so:

Select * From Tabelle Inner Join Tabelle_2 on Tabelle.Spalte_1 like "*" & Tabelle_2.Spalte_x & "*"
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Beaker s.a.

Hallo,
Nur damit es keine Verwirrungen gibt:
"%" auf SQL-Servern
"*" bei JET-Datenbanken

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Kloso

Vielen Dank,
dieser Code funktioniert super:
Select * From Tabelle Inner Join Tabelle_2 on Tabelle.Spalte_1 like "*" & Tabelle_2.Spalte_x & "*"

Nun wie könnte man jetzt die beiden kombinieren, so dass das Ergebnis vom ersten und das Ergebnis vom zweiten in einer Abfrage erscheinen.
Das war noch mal der erste der die 1 zu 1 Suche durchgeführt hat:
SELECT *
FROM Tabelle
WHERE Spalte_1 IN (SELECT Spalte_x FROM Tabelle_2);


Nun möchte ich die 1 zu 1 Suche, und die andere kombinieren?
Kann man bei dem Inner Join eine AND funktion verwenden, hat leider nicht geklappt bei mir.
Möchte diese Variante der "1 zu 1 Suche" hinzufügen: 

Tabelle.Spalte_1=Tabelle_2.Spalte_X
Viele Grüße Kloso

DF6GL

Hallo,

was willst Du denn damit überhaupt erreichen?

Es ergäbe auch keine anderen Datensätze.....


Select * From Tabelle Inner Join Tabelle_2 on Tabelle.Spalte_1 like "*" & Tabelle_2.Spalte_x & "*"
Union
SELECT * FROM Tabelle WHERE Spalte_1 IN (SELECT Spalte_x FROM Tabelle_2)


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MaggieMay

Hallo,
Zitat von: Kloso am November 02, 2016, 11:32:38
so dass das Ergebnis vom ersten und das Ergebnis vom zweiten in einer Abfrage erscheinen
das Ergebnis der ersten Abfrage sollte eigentlich im Ergebnis der zweiten Abfrage enthalten sein.
Freundliche Grüße
MaggieMay

Kloso

DF6GL danke, es hat geklappt.

Doch, es bleiben die Datensätze die nicht übereinstimmen, den in Tabelle in der Spalte_1 sind auch Datensätze die nicht in der Spalte_X vorhanden sind, dann müssen sie auch nicht angezeigt werden.
Bsp.:

Spalte_1:
Hallo Welt
Hallo Welt mein Haus
Haus ist grün
Katze ist grau
Himmel ist blau

Spalte_x:
grün
mein Haus
Hund ist gelb
Himmel ist blau

Ergebnis mit meinem SQL:
Hallo Welt mein Haus
Haus ist grün
Himmel ist blau

"Hallo Welt" und "Katze ist grau" werden nicht angezeigt weil es keine Übereinstimmung mit Spalte_x gibt.


Klappt wunderbar. Vielen Dank für die Hilfe :)
Viele Grüße Kloso

Kloso

MaggieMay, leider nein. Die Abfrage hatte mir nur die Ergebnisse geliefert, wo auch etwas links und rechts gestanden ist.
Viele Grüße Kloso

MaggieMay

Dann hast du vielleicht doch das falsche Suchmuster verwendet.
Wie wär's mit dem ursprünglich verwendeten "%"-Zeichen?!
Freundliche Grüße
MaggieMay

Kloso

MaggieMay habs eben so so und so ausprobiert, :)

Es funktioniert mit '*' + .... + '*'

Jedoch gibt es da ein kleinen Hacken, wenn in der Tabelle_2 ein alleinstehenden Kürzel gibt (z.Bsp AR) in einem Feld, dann spuckt er mir aus der Tabelle_1: "Haribo" raus, weil er ar darin erkennt.

Wenn ich aber mit '* ' + .... + ' *' es mache, dann spuckt er mir zwar "Haribo" nicht raus, was auch gut ist, aber dann leider kein Feld in welchem nur "AR" steht, weil er ein leerzeichen davor und danach erwaret.

Also denke ich dass es erstmal nur so möglich wäre alles richtig darzustellen in dem man mehrere Unions verknüpft:

1) '* ' + .... + ' *' UNION
2) '*' + .... UNION
3) .... + '*' UNION
4) ....=....

Dann geht es zwar, sieht aber sehr unübersichtlich aus.
Viele Grüße Kloso

Kloso

PS:
mit % hat er leider überhaupt nichts angezeigt.
Viele Grüße Kloso

Josef P.

#11
Eine nicht unwichtige "Nebensache", dass du auch Leerzeichen im Like-Ausdruck verwendest. ;)
In den bisher gezeigten Codes war das nirgends zu sehen.

Statt Union kannst du auch OR verwenden.

Select * From Tabelle Inner Join Tabelle_2 on (
    Tabelle.Spalte_1 like "* " & Tabelle_2.Spalte_x & " *"
    OR
    Tabelle.Spalte_1 like "* " & Tabelle_2.Spalte_x
    OR
    Tabelle.Spalte_1 like Tabelle_2.Spalte_x & " *"
    OR
    Tabelle.Spalte_1 = Tabelle_2.Spalte_x
)

Bin mir aber nicht sicher, ob Jet das kann.
Falls nicht, in den Where-Teil verlagern:
Select Tabelle.* From Tabelle, Tabelle_2
where
    Tabelle.Spalte_1 like "* " & Tabelle_2.Spalte_x & " *"
    OR
    Tabelle.Spalte_1 like "* " & Tabelle_2.Spalte_x
    OR
    Tabelle.Spalte_1 like Tabelle_2.Spalte_x & " *"
    OR
    Tabelle.Spalte_1 = Tabelle_2.Spalte_x


Und da das sowieso zum Table-Scan in "Tabelle" führt, kann man auch gleich auf die "Suchbremse" drücken:
Select Tabelle.* From Tabelle, Tabelle_2
where
    " " & Tabelle.Spalte_1 & " " like "* " & Tabelle_2.Spalte_x & " *"


bzw.
Select Tabelle.* From Tabelle inner join Tabelle_2 ON
    " " & Tabelle.Spalte_1 & " " like "* " & Tabelle_2.Spalte_x & " *"


mfg
Josef

Kloso

Hallo Josef P.,

vielen Dank auch an dich, habe alle 4 optionen ausprobiert. Alle funktionieren und alle bringen das gleiche richtige ergebnis.

Ihr schreibt alle dieses Zeichen &, bei mir bringt es aber ein sehr erschreckendes Ergebnis von über 100 000 tausend einträgen an dem jedes Feld tausende Male aufgelistet ist. Ich benutze das + Zeichen anstatt &, dann funktionierts problemlos.
Viele Grüße Kloso

Josef P.

#13
ZitatIhr schreibt alle dieses Zeichen &, bei mir bringt es aber ein sehr erschreckendes Ergebnis von über 100 000 tausend einträgen an dem jedes Feld tausende Male aufgelistet ist. Ich benutze das + Zeichen anstatt &, dann funktionierts problemlos.
Weil du mit + die NULL-Werte eliminierst, da mit Null ein Like-Vergleich keinen Treffer bringt. Du hast vermutlich einige NULL-Werte in den verwendeten Datenfeldern.

'abc' + NULL + 'xyz' ergibt NULL
'abc' & NULL & 'xyz' ergibt 'abcxyz'

MIt dem & kann z. B. folgender Vergleich entstehen:
... like "*  *"
or
... like "* "
usw.

   
So kann ein leeres Feld in der Filterwert-Tabelle natürlich zu vielen Treffern führen.
Allerdings stelle ich mir dann die Frage, ob das ein korrekter Eintrag in einer Tabelle ist, die Filterwerte enthält.

mfg
Josef