2017-06-28 1 views
0

ich folgendes Problem:Ungültige Verwendung von null in where-Anweisung; keine Nullwerte

ich zwei Abfragen bin mit importierten Daten zu analysieren, werden sie Daten sowohl die Auswahl Die importierte Datenmenge ziemlich komplex ist, aber dies gibt den Fehler.

QueryA:

SELECT CDbl(FieldA) As DblA, Imported.* From Imported WHERE FieldA IS NOT NULL 

QueryB:

SELECT * FROM QueryA WHERE DblA > 7 AND DblA < 600 

QueryA fein läuft, QueryB eine ungültige Verwendung von null Fehler wirft

Wenn ich die Ergebnisse von QueryA in eine Tabelle und Lauf einfügen QueryB dagegen empfange ich den Fehler nicht, dies ist jedoch nicht erwünscht.

Wenn ich die WHERE von QueryB entfernen, läuft es gut.

Gibt es eine andere Problemumgehung dafür? Oder sollte ich einfach die redundante Tabelle akzeptieren?

+0

Würde 'NZ' es lösen? 'SELECT * FROM AbfrageA WHERE NZ (DblA, 0)> 7 UND NZ (DblA, 0) <600 '. Alle Null-Werte werden durch 0 ersetzt. –

+0

@ DarrenBartrup-Cook 'NZ' löst es nicht. In dieser Spalte gibt es keine Nullwerte. –

+1

Ich würde vorschlagen, zuerst 'Importierte. *' Aus der QueryA zu entfernen und dann explizit Felder zu QueryA hinzuzufügen. Möglicherweise finden Sie ein Feld in der Datenmenge, mit der ms-access ein Problem hat. – manotheshark

Antwort

0

Ah, repariert es, weiß immer noch nicht warum.

QueryA Changed

SELECT CDbl(Nz(FieldA, 999)) As DblA, Imported.* From Imported WHERE FieldA IS NOT NULL AND Nz(FieldA, 999) <> 999 

Soweit meine SQL-Kenntnisse dies einen Unterschied machen sollte nicht geht, aber es tut. Wenn jemand es erklären kann, würde ich es begrüßen.

Die 999 statt 0 ist, weil sonst würde ich Division durch 0 Fehler in anderen Funktionen bekommen (während wirklich Access sollte keine Funktionen damit laufen, da es ausgefiltert ist).

+1

Ich denke, der Abfrageoptimierer ist das Problem. Meine Vermutung ist, dass es versucht, den 'DblA> 7 UND DblA <600 'Abschnitt vor' FieldA IS NOT NULL 'auszuwerten. Es führt sie nicht als separate Abfragen. Dies führt zu Geschwindigkeitsgewinnen bei der Auswahl aus einer Abfrage, die viele Daten zurückgibt, kann aber auch diese seltsamen Fehler verursachen, wenn die Abfrage nicht in der erwarteten Reihenfolge ausgeführt wird. – Quark

+0

@ Quark macht Sinn, danke für die Erklärung. Ich dachte immer, dass der Optimierer, der seltsame Dinge macht, eine MS SQL-Sache ist und dass Access nur die Dinge in der richtigen Reihenfolge verarbeitet, aber ich vermute, dass ich falsch lag. In einem Kurs habe ich sogar gelernt, dass ich Unterabfragen verwenden sollte, anstatt auf andere Abfragen zu verweisen, sonst würde der Optimierer nicht funktionieren. –

+0

Es macht für mich Sinn, dass es so ist, Dinge zu tun, aber ich habe keine Dokumentation darüber. Sonst hätte ich es als Antwort gepostet :) – Quark

0

Versuchen Sie diese Abfrage.

SELECT * FROM QueryA WHERE DblA > 7 AND DblA < 600 AND Dbla IS NOT NULL 
+0

Nein, noch ungültige Verwendung von null –

+0

Warum wenden wir die Bereichsbedingung in Abfrage A? SELECT CDbl (FieldA) als DblA, importiert. * Aus importiertem WHERE FieldA ist NOT NULL und FieldA> 7 AND FieldA <600. –

+0

Es gibt mehrere Abfragen, die von QueryA abhängen, und QueryA verwendet tatsächlich eine IIF-Anweisung, die DblA aus einem von drei Feldern abruft. –

Verwandte Themen