Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

MySQL Problem Abfrage mit NOT LIKE

uspc / 9 Antworten / Baumansicht Nickles

Hallo, ich habe ein Problem mit einer MySQL Abfrage.

Ich habe 2 Tabellen, bei denen in einer bestimmten Spalte Nummern stehen.

Dabei muss ich mit SUBSTRING arbeiten, um die Nummern an bestimmten Stellen zu vereinheitlichen.

Nummer 1: 000000001876009

Nummer 2: 1876009

Soweit alles ok.

Jetzt möchte ich die Datensätze angezeigt bekommen, die NICHT in der 2. Tabelle enthalten sind.

SELECT tab1.indexnr FROM tab1, tab2   WHERE SUBSTRING(tab1.BS, 8, 7)

NOT LIKE SUBSTRING(tab2.BN, 1, 7);

Umgekehrt geht’s, also wenn ich sage, zeig mir all Daten die in beiden Tabellen vorkommen.

Statt = setze ich NOT LIKE , das bringt aber nicht den umgekehrten Effekt.

Kann jemand helfen? Danke!

Gruß uspc0

bei Antwort benachrichtigen
gelöscht_254676 uspc „MySQL Problem Abfrage mit NOT LIKE“
Optionen
SELECT
  feld1, feld2
FROM
  tabelle1 t1
LEFT JOIN
  tabelle2 t2
ON
  t1.id = t2.id
WHERE
  t2.feld1 IS NULL
OR
  t1.feld1 <> t2.feld1
OR
  t1.feld1 <> t2.feld2


Vielleicht hilft diese Abfrage! Mußt du nur an deine Tabellen bzw. Felder anpassen...

... gibt alle Datensätze aus Tabelle 1 aus, die in Tabelle 2 nicht existieren oder anders sind.
bei Antwort benachrichtigen
uspc gelöscht_254676 „SELECT feld1, feld2 FROM tabelle1 t1 LEFT JOIN tabelle2 t2 ...“
Optionen

Danke für die Hilfe. Ich habe in tab1 leider nicht die Index wie in tab2, daher kann ich wohl die Zeile

ON
  t1.id = t2.id

nicht anwenden. Benötigt wird eigentlich nur die Index (also hier die laufende Tabellen-
Eintragsnummer) aus tab1.
Lass es mir beschreiben:
In tab1 sind verschiedene Vorgänge und die Betriebsnummern vieler Betriebe.
In tab2 sind nur Betriebsnummern unserer Kunden mit den Anschiften der Betriebe.
Alle fremden Betriebe will ich aus tab1 in eine baugleiche tab3 verschieben, brauche ich
eigentlich nicht mehr.

Meine Idee war, in der tab1 wie oben beschieben die fremden Betriebe auszulesen, in einem
bestimmten Feld (per Update) diese zu markieren um sie dann in die baugleiche tab3 zu
verschieben. In tab1 sind dann nur noch unsere Kunden.
Für SQL-Profis bestimmt kein Ding, alles in einem Rutsch zu schreiben.
Der Kontrolle wegen und Übersicht wollte ich das nacheinander ablaufen lassen.
Blöd ist, dass die Betriebsnummern in tab1 und tab2 jeweils anders sind, mit
SUBSTRING(tab1.BS, 8, 7)
SUBSTRING(tab2.BN, 1, 7)
sind die Nummern gleich. Ist leider durch ständigen Import so vorgegeben.

Das LEFT JOIN ... ON - kannst du mir das mit 3 Worten ganz einfach übersetzen?
Vielen Dank, ich versuch natürlich auch mich schlauzulesen...
VG uspc
bei Antwort benachrichtigen
gelöscht_254676 uspc „Danke für die Hilfe. Ich habe in tab1 leider nicht die ...“
Optionen
Das LEFT JOIN ... ON - kannst du mir das mit 3 Worten ganz einfach übersetzen?Vielen Dank, ich versuch natürlich auch mich schlauzulesen...

Hier wird das mit den Joins ganz gut erklärt, besser als ich es könnte

MySql - Joins

Leider ist der von dir geschriebene Text für mich nicht vollständig lesbar, die rechte Seite ist abgeschnitten... :-(

bei Antwort benachrichtigen
uspc gelöscht_254676 „Hier wird das mit den Joins ganz gut erklärt, besser als ...“
Optionen

Hallo sunraid,

Danke für den Link, echt gut!

Das mit der recht abgeschnittenen Seite hatte ich bei dir auch, k.A. warum das hier so ist, ich nutze den Firefox. Ich habe beim Eingeben peinlich genau mit einem ENTER eine neue Zeile gesetzt, wenn ich am Rand war. Offensichtlich verkehrt. Vielleicht kann M.N. hier noch was verbessern?

So, ich nehm mal den Textblock oben und setz ihn nochmal rein:

>>> Start Kopie

Danke für die Hilfe. Ich habe in tab1 leider nicht die Index wie in tab2, daher kann ich wohl die Zeile

ON
  t1.id = t2.id


nicht anwenden. Benötigt wird eigentlich nur die Index (also hier die laufende Tabellen-
Eintragsnummer) aus tab1.
Lass es mir beschreiben:
In tab1 sind verschiedene Vorgänge und die Betriebsnummern vieler Betriebe.
In tab2 sind nur Betriebsnummern unserer Kunden mit den Anschiften der Betriebe.
Alle fremden Betriebe will ich aus tab1 in eine baugleiche tab3 verschieben, brauche ich
eigentlich nicht mehr.
Meine Idee war, in der tab1 wie oben beschieben die fremden Betriebe auszulesen, in einem
bestimmten Feld (per Update) diese zu markieren um sie dann in die baugleiche tab3 zu
verschieben. In tab1 sind dann nur noch unsere Kunden.
Für SQL-Profis bestimmt kein Ding, alles in einem Rutsch zu schreiben.
Der Kontrolle wegen und Übersicht wollte ich das nacheinander ablaufen lassen.
Blöd ist, dass die Betriebsnummern in tab1 und tab2 jeweils anders sind, mit
SUBSTRING(tab1.BS, 8, 7)
SUBSTRING(tab2.BN, 1, 7)
sind die Nummern gleich. Ist leider durch ständigen Import so vorgegeben.

Das LEFT JOIN ... ON - kannst du mir das mit 3 Worten ganz einfach übersetzen?
Vielen Dank, ich versuch natürlich auch mich schlauzulesen...
VG uspc

ENDE Kopie <<<<

Hoffe, das klappt jetzt - Danke!

bei Antwort benachrichtigen
xafford uspc „Danke für die Hilfe. Ich habe in tab1 leider nicht die ...“
Optionen

Warum machst Du es Dir nicht einfach und verschiebst statt der nicht benötigten in eine andere Tabelle, die benötigten in eine andere Tabelle und benennst die anschließend um?

Schema wäre ungefähr:

INSERT INTO
    `neue_tabelle`
SELECT
    *
FROM
    `tab1`
WHERE
    `bs1` IN (
        SELECT
            SUBSTRING(`bs2`,....)
        FROM
            `tab2`
    )
Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
st.lu xafford „Warum machst Du es Dir nicht einfach und verschiebst statt ...“
Optionen
bei Antwort benachrichtigen
uspc xafford „Warum machst Du es Dir nicht einfach und verschiebst statt ...“
Optionen

Hallo xafford, das ist ne echt gute Idee, nur greifen noch an vielen anderen Stellen Scripte auf die tab1 zu. Die müsste ich ja dann umbauen - was nicht so schwer wäre, aber erstmal finden :(  Aber echt überlegenswert. Wenn alles nicht so richtig geht, nehme ich diese Variante. Danke!

VG uspc

bei Antwort benachrichtigen
xafford uspc „Hallo xafford, das ist ne echt gute Idee, nur greifen noch ...“
Optionen
Die müsste ich ja dann umbauen

Vielleicht habe ich es etwas unklar formuliert: Ich meinte, dass Du anschließend die neue Tabelle (also die mit den Daten, die Du noch brauchst) so benennt, wie zuvor und der originalen (in der dann auch die Werte sind, die Du nicht brauchst) einen anderen Namen gibst. Dann dürften die Skripte eigentlich unverändert funktionieren.

PS: Grundsätzlich scheint das Datenbank-Layout aber nicht so glücklich gewählt und was die unterschiedlichen Nummern in den Tabellen angeht könnte Dir eventuell auch die Option ZEROFILL helfen falls der Unterschied nur die Nullen linksseitig sind.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
uspc xafford „Vielleicht habe ich es etwas unklar formuliert: Ich meinte, ...“
Optionen

@xafford: Ich habe das jetzt angelehnt nach deinem Vorschlag gelöst. An einer anderen Stelle, direkt beim Imoprt der CSV-Dateien markiere ich in einer neuen Spalte unsere Kunden. Das kann ich mit IST GLEICH ganz einfach lösen. Da ich noch andere Datensätze verschieben muss bedinge ich das nun so, dass auch ganz einfach alle fremde Betriebe verschoben werden.

Das DB-Design ist etwas kuddelmuddel, bedingt aber durch den wöchentlichen Import mehrerer neuer vorgegebener CSV-Dateien entstanden. Aufgrund der Anzahl der Datensätze lasse ich nach Abarbeiten der Felder die Daten wieder in eine CSV exportieren  (so will es meine Kollegin) und die Tabellen werden unterschiedlich geleert. Also immer neue Indexwerte. Hatte irgendwie keine bessere Idee... Soll ja auch nur eine zeitlich begrenzte Arbeitshilfe - eine Krücke - sein.

Warum das oben beschriebene (NOT LIKE) sich als doch nicht ganz so einfache Abfrage der DB  rausstellt ist mir aber doch noch etwas unklar. Nun ja, in der nächsten Runde werde ich noch mehr auf Indexwerte und DB-Design achten. Und trotzdem noch etwas an der Lösung oben basteln...

Danke an allen Helfern! VG uspc

bei Antwort benachrichtigen