/ / Ausdruck aus einer Abfrage, die in eine nachfolgende Abfrage gezogen wird - SQL, MS-Access

Ausdruck von einer Abfrage, die in die nachfolgende Abfrage gezogen wird - sql, ms-access

Ich habe folgende Tabellen "Base" und "Join":

Base:
ID  Field
A   1
B   2
D

Join:
ID
A
B
C
D

Ich verwende die folgende Auswahlabfrage "ExampleQuery", um "Base" zu analysieren:

SELECT Base.ID, IIf(IsNull([Field]),"None",[Field]) AS Newfield
FROM Base;

Und die folgende Auswahlabfrage zur Left-Join-Tabelle "Join" zur Abfrage "ExampleQuery":

SELECT Join.ID, ExampleQuery.Newfield
FROM [Join] LEFT JOIN ExampleQuery ON Join.ID = ExampleQuery.ID;

Meine Ausgabe ist folgende:

ID  Newfield
A   1
B   2
C   None
D   None

Ich erwarte, dass der Wert von C seitdem null istwar in der Ausgabe von ExampleQuery nicht vorhanden, verwendet jedoch stattdessen die Logik aus dem Ausdruck in der ursprünglichen Abfrage. Was verursacht dies und wie kann ich es verhindern? Ich möchte meine anfängliche Auswahlabfrage ausschließlich als temporäre Tabelle behandeln.

Antworten:

1 für die Antwort № 1

Sie können versuchen, einer Unterabfrage beizutreten, die zuerst fehlende Feldwerte in ersetzt Base Tisch mit None:

SELECT t1.ID, t2.Newfield
FROM [Join] t1
LEFT JOIN
(
SELECT ID, IIF(ISNULL([Field]),"None", [Field]) AS Newfield
FROM Base
) t2
ON t1.ID = t2.ID;

Apropos, JOIN ist ein reserviertes Schlüsselwort in Access (und wahrscheinlich in jeder anderen Version von SQL). Sie sollten vermeiden, Tabellen, Spalten usw. mit Schlüsselwörtern zu benennen.


0 für die Antwort № 2

Dies geschieht, weil es zwei Möglichkeiten gibt, dieFeld kann null sein: Es kann null sein, weil es einen Datensatz gibt, in dem dieses Feld null ist, oder weil es überhaupt keinen passenden Datensatz gibt, den der äußere Join finden kann.

Es hört sich so an, als hätten Sie eine weitere Tabelle hinzugefügtIhre Abfrage, anstatt die gesamte Abfrage mit einer Tabelle zu verbinden, wie Sie angegeben haben. Ich denke, um dies zu beheben, müssten Sie das tun, was Sie beschrieben haben, nämlich die gesamte Abfrage äußerlich zu verbinden. In Access kann dies erreicht werden, indem Sie mit Ihrer zurückgegebenen Abfrage beginnen

ID  NewField
A   1
B   2
D   None

Und Speichern als z. B. Abfrage1. Sie würden dann eine neue Abfrage erstellen und Query1 einschließen (Access behandelt dies wie eine Tabelle) und diese dann mit Ihrer anderen Tabelle verknüpfen.


0 für die Antwort № 3

Bis zur tatsächlichen Auflösung habe ich eine Problemumgehung gefunden, indem ich dem Ausdruck eine weitere Bedingung hinzugefügt habe. Wenn ich "ExampleQuery" in Folgendes ändere:

SELECT Base.ID, IIf(IsNull([Field]) And Not IsNull([ID]),"None",[Field]) AS Newfield
FROM Base;

Dann erhalte ich meine gewünschte Ausgabe, wenn ich die nachfolgende Abfrage ausführe, die "ExampleQuery" mit der Tabelle "Join" übereinstimmt:

ID  Newfield
A   1
B   2
C
D   None