Access 2007 - Linke Verknüpfung zu einer Abfrage gibt #Error anstelle von Null zurück
Ähnlich wie diese Frage, aber ihr Problem mit der Abfrage wurde nie vollständig gelöst:
#Fehler in mehreren LEFT JOIN-Anweisungen Zugriffsabfrage, wenn der Wert NULL sein soll
Ich erhalte #Error, wenn ich einen Nullwert erwarte, wenn ein linker Join ausgeführt wird, bei dem kein entsprechender Datensatz auf der rechten Seite des Joins vorhanden ist:
Chain CasesPerMonthPerStore MonthOfFirstOrder
Naturally 2.3 5/1/2011
Tom's Market #Error
Livingstons #Error
EverClear 3.1 7/1/2012
Bob's Market 2.66 5/1/2012
Andy's Exports #Error
Jamestowns 0.89 7/1/2012
Es funktioniert einwandfrei, wenn ich die Daten in eine Tabelle kopiere und die Verknüpfung mit dieser Tabelle belasse. Daher gehe ich davon aus, dass etwas in der Syntax der Abfrage nicht stimmt:
SELECT
MonthRange.Chain,
MonthRange.CasesShipped/IIf(MonthsSinceFirstOrder.Months>DateDiff("m",QueryDates.StartDate,QueryDates.EndDate)+1,
DateDiff("m",QueryDates.StartDate,QueryDates.EndDate)+1,
MonthsSinceFirstOrder.Months)/NumStores.NumberOfStores AS CasesPerMonthPerStore,
MonthsSinceFirstOrder.MonthOfFirstOrder
FROM
QueryDates,
(
MonthRange
INNER JOIN
NumStores
ON MonthRange.Chain=NumStores.Chain
)
INNER JOIN
MonthsSinceFirstOrder
ON MonthRange.Chain=MonthsSinceFirstOrder.Chain;
Dieser SQL-Code gibt die korrekten Ergebnisse zurück. Es ist nur sein Verhalten, wenn Left Joining to it #Errors zurückgibt.
nb die seltsame Iif-Anweisung in der Mitte prüft, ob die Anzahl der Monate seit der ersten Bestellung größer ist als die Anzahl der Monate im angegebenen Datumsbereich - also wenn der Datumsbereich 6 Monate umfasst und die erste Bestellung 9 Monate zuvor war Für das Enddatum wird 6 verwendet. Wenn die erste Bestellung nur 4 Monate vor dem Enddatum war, wird 4 verwendet.
- UPDATE BEARBEITEN -
Richtig, ich habe die Elemente der Abfrage nacheinander entfernt. Dies ist die einfachste Methode, die ich erhalten kann, während der Verbindungsfehler für die linke Seite erneut erstellt wird:
SELECT
MonthRange.Chain,
DateDiff("m",QueryDates.StartDate,QueryDates.EndDate)+1 AS CasesPerMonthPerStore
FROM
QueryDates,
MonthRange;
Und so komme ich dazu:
SELECT
Chains.Chain,
ErrorQuery.CasesPerMonthPerStore
FROM
Chains
LEFT JOIN
ErrorQuery
ON Chains.Chain=ErrorQuery.Chain;
Sieht irgendetwas in dieser SQL falsch aus?