2016-10-20 12 views
0

Erlauben Sie mir meine Frage in informeller Weise (nicht die richtige Syntax folgt) zu teilen, wie ich ein Neuling bin - meine Entschuldigung:SQL-Abfrage in einer Abfrage

select * from table where 
    (
      (category = Clothes) 
      OR 
      (category = games) 
    ) 
    AND 
    (
      (Payment Method = Cash) OR (Credit Card) 
    ) 

Dies ist ein Teil von meiner Anfrage. Der andere Teil ist, dass aus dem Ausgang des oben, ich habe nicht die Aufzeichnungen der Erfüllung dieser Kriterien zeigen wollen:

  • Category = Clothes
  • Branch = B3 OR B4 OR B5
  • Customer = Chris
  • VIP Level = 2 OR 3 OR 4 OR 5

SQL nicht Teil meiner Arbeit ist, aber ich mache es Dinge für mich zu erleichtern . Sie können mich also als Neuling betrachten. Ich habe online gesucht, vielleicht habe ich die Lösung verpasst.

Danke,

HimaTech

+0

diese Abfrage ist SQL nicht MDX ... Welche Art von Datenbank werden Sie abfragen - eine relationale Datenbank oder ein OLAP-Cube in SSAS? – whytheq

+0

Die Datenbank ist MS SQL mit PowerPivot. – HimaTech

+0

Also ist MDX beteiligt? Wenn Sie ein Powerpivot verwenden, fragen Sie die Datenbank mit mdx ab? Ich würde vermuten, dass die Sprache entweder sql oder dax sein wird? – whytheq

Antwort

0

Es gibt ein paar Möglichkeiten gibt, dies zu tun (speziell in SQL - nicht bei MDX hier suchen).

Der am einfachsten zu verstehende Weg wäre, das Dataset, das Sie ausschließen möchten, als Unterabfrage zu erhalten und den Befehl not exists/not in zu verwenden.

SELECT * FROM table 
WHERE category IN ('clothes', 'games') 
    AND payment_method IN ('cash', 'credit card') 
    AND id NOT IN (
     -- this is the subquery containing the results to exclude 
     SELECT id FROM table 
     WHERE category = 'clothes' [AND/OR] 
      branch IN ('B3', 'B4', 'B5') [AND/OR] 
      customer = 'Chris' [AND/OR] 
      vip_level IN (2, 3, 4, 5) 
    ) 

Eine weitere Möglichkeit, es tun können, ist, um die Ergebnisse, die Sie zu den Gesamtergebnissen ausschließen zu wollen, schließen sich links, und schließen Sie diese Ergebnisse mit IS NULL wie so:

SELECT t1.* 
FROM table 
LEFT JOIN 
    (SELECT id FROM table 
     WHERE customer = 'chris' AND ...) -- results to exclude 
    AS t2 ON table.id = t2.id 
WHERE t2.id IS NULL 
AND ... -- any other criteria 

Der hier Trick ist, Wenn bei einem linken Join kein Ergebnis aus dem Join besteht, ist der Wert null. Aber das ist sicherlich schwieriger zu verstehen.

Es wird auch unterschiedliche Auswirkungen auf die Leistung haben, wenn Sie es auf die eine oder andere Weise tun. Es lohnt sich also, darauf einzugehen. Dies ist wahrscheinlich ein guter Anfang: What's the difference between NOT EXISTS vs. NOT IN vs. LEFT JOIN WHERE IS NULL?

+0

Vielen Dank für Ihre Antwort. Wenn ich versuche, die Abfrage auszuführen, erhalte ich einen Fehler, der inkorrekte Syntax in der Nähe von AND NOT IN sagt. Ich habe das Internet durchsucht und sehe, dass ich mich auf eine Spalte beziehen muss. – HimaTech

+0

Versuchen Sie die linke JOIN scheint einfacher für mich, aber ich bekomme immer diesen Fehler: – HimaTech

+0

Fehler: Mehrdeutige Spalte Name – HimaTech