2017-11-20 2 views
1

Ich bin mir sicher, dass die Antwort direkt auf mich starrt, aber ich kann es nicht herausfinden. Ich habe 2 Tabellen mit der gleichen Nummer, in einer Tabelle nur mit Zahlen, in der anderen mit Bindestrichen zufällig überall verstreut (ja, Müll in). Ich versuche eine abzufragen, wo der Wert, der die Bindestriche ignoriert, nicht in einer anderen Tabelle ist. Ich kann es für IN arbeiten, aber es funktioniert nicht für NOT IN. Was mache ich hier falsch?Abfrage, wo table.column geänderte Spalte einer anderen Tabelle nicht ersetzt

Diese Abfrage, die gleichen wie unten aber mit IN statt NICHT funktioniert:

SELECT * FROM table_a 
WHERE reference_number IN (SELECT replace(reference_number_messy,'-','') 
          FROM table_b) 

Diese Abfrage, das gleiche wie die oben, aber mit NICHT statt IN, würde ich denken würde zurückkehren alles in table_a nicht in der obigen Abfrage, aber es ist nicht. Stattdessen gibt es keine Ergebnisse:

SELECT * FROM table_a 
WHERE reference_number NOT IN (SELECT replace(reference_number_messy,'-','') 
           FROM table_b) 

Was mache ich falsch? Wie kann ich diese zweite "NICHT IN" -Abfrage erhalten?

Antwort

1

Sie haben wahrscheinlich NULL Werte in Unterabfrage.

SELECT * 
FROM table_a 
WHERE reference_number NOT IN (
        SELECT COALESCE(replace(reference_number_messy,'-','') ,'') 
        FROM table_b); 

oder aus Filtern:

SELECT * 
FROM table_a 
WHERE reference_number NOT IN (
        SELECT replace(reference_number_messy,'-','') 
        FROM table_b 
        WHERE reference_number_messy IS NOT NULL); 

Erläuterung:

x IN (y, z)  <=> x = y OR x = z 
x NOT IN (y,z) <=> x != y AND x != z 

etwas NULL wird UNKNOWN (nicht wahr) ergeben Vergleicht man könnte es COALESCE mit vermeiden. Du bekommst also keine Zeilen.

+0

In Tabelle_b waren NULL-Werte enthalten. Keine dieser Lösungen funktioniert jedoch. Beide geben einen ähnlichen Fehler zurück. Die zweite (filternde) Lösung gibt den folgenden Fehler zurück: # 1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; Sie in die Bedienungsanleitung zu Ihrer MySQL-Server-Version für die richtige Syntax entspricht in der Nähe zu verwenden '-listings WHERE NOT IN ( SELECT ersetzen ('reference_number_messy' Folio,' - ' '') ' at line 1 –

+0

WHERE folio NOT IN (SELECT ersetzen (reference_number_messy, '-', '') 'so dass Sie eine vereinfachte Abfrage gepostet haben und nun behaupten, dass es einen Syntaxfehler hat. Leider kann ich Ihnen nicht ohne Ihre vollständige und tatsächliche Abfrage helfen. – lad2025

+0

SELECT * FROM o_m -m WHERE Folio NICHT IN (SELECT Ersetzen (FNumber, '-', '') FROM wrldb WHERE FNumber ist nicht NULL); –

Verwandte Themen