Mehrere Bedingungen mit und UND ODER in die WHERE-Klausel von SQL Server

Arbeite ich in Microsoft SQL Server Management Studio. Ich habe mehrere Tabellen, mit dem ich arbeite und mehrere Bedingungen (fast 80), dass ich die Abfrage an, wo ich bin versuchen, um eine Teilmenge der verknüpften Daten.

Die Idee ist, dass ich brauche, um zu greifen, Daten aus einer beitreten, in denen die Daten nicht in eine andere join mit einer Bedingung (d.h., NOT IN), dann Brauch ich den filter auf eine Reihe von Bedingungen, die mehrere Spalten und mehrere Bedingungen für jede Spalte. Mein problem (glaube ich) ist, die sich aus der OR Zustand. Ich habe eine Spalte, sagen col5, wo, wenn Sie nicht erfüllen alle Bedingungen in der AND Zustand, dann Brauch ich den filter weiter auf Sie (daher, die OR Zustand).

Was ich bisher geschrieben haben ist der folgende,

SELECT 
    handfulOfColumns
FROM 
    table1 AS t1
LEFT JOIN
    (SELECT *
     FROM table2
     WHERE col2 = 'thing0' or col2 = 'thing1') AS t2 ON t1.col1 = t2.col1
WHERE 
    t1.col1 NOT IN (SELECT t1.col1
                    FROM table1 t1
                    LEFT JOIN table3 t3 ON t1.col1 = t3.col1
                    WHERE col3 LIKE '%thing3%')
    AND (col4 > '#' AND col5 NOT LIKE 'thing4' 
         AND col5 != 'thing5' AND col5 NOT LIKE 'thing6' 
         AND col6 NOT LIKE 'thing7'
         --...
         --... add like 20 lines of conditions similar to above
         --...
         AND col34 NOT LIKE 'thing77' AND LEN(col35) > '#')
     OR (col5 NOT LIKE '% %' AND col5 LIKE '%[a-z]%' 
         AND col5 NOT LIKE '%[0-9]%' 
         AND col5 NOT LIKE 'thing209' 
         AND col5 NOT LIKE 'thing210');

Der Grund dafür ist, ich habe eine Menge (chaotisch) Telefonnummern ich bin den Umgang mit in col5, und insgesamt gibt es eine Menge von Reinigung zu tun, die auf alle Spalten. Einige dieser Telefonnummern wird der text eingegeben, statt, und je nach dem Kontext kann ich wollen, Sie zu halten oder filtern Sie diese heraus (also Fälle, in denen die Telefon-Nummer eingetragen ist, als 'business name' oder 'business' oder 'alskfjalsdkjf' statt '555-5555' oder '555 5555", etc.). Wenn die Daten den Kriterien entspricht, die von der AND Bedingungen (vor allem das herausfiltern Variationen col5 not like '%555-5555%'), dann muss ich weiter prüfen und filtern, für alle nicht-numerischen Zeichen in col5 durch die OR Zustand.

Gibt es keine Fehlermeldungen - stattdessen wird die Abfrage dauert eine wirklich lange Zeit, um zu beenden und gibt mir mehr Reihen von Daten, als ich begann, mit der ist das Gegenteil von dem, was geschehen sollte. Basierend auf der Struktur von table1 und table2, gibt es ein Potenzial einführen doppelten Zeilen durch verknüpfen der zwei Tabellen, aber die Menge der Klimaanlage und sub-Einstellung ich Tue mir geben sollte weit weniger als die ursprüngliche Anzahl der Zeilen sogar mit ein paar Duplikate hier und da.

Ich bin nicht sicher, wo meine Logik versagt bei diesem, jede Hilfe ist willkommen 🙂

fixieren Sie die sub-Abfrage in der linken beitreten, wenn seine Rückkehr mehr Werte als das, was Sie ursprünglich hatte, dann, dass die Unterabfrage zurückgibt Duplikate.
Die Sache ist, wenn ich nur die join-Teil das ich bekommen in etwa 64K Zeilen von Daten (das wäre einschließlich der Duplikate, als table1 allein hat über 60K Zeilen von Daten) . Aber wenn ich dann auf hinzufügen alle von den Bedingungen, beginnend mit der WHERE Klausel, dass ich am Ende mit etwa 67 Zeilen von Daten - logisch, wo sollte ich am Ende mit unter 64K. So auch die Buchhaltung für Duplikate, die es noch gibt einen höheren Betrag als erwartet.

InformationsquelleAutor rastrast | 2017-01-26

Schreibe einen Kommentar