2017-12-08 6 views
0

Die Grundidee: Ich möchte eine Liste aller Prozesse, die innerhalb einer bestimmten Abteilung existieren. Prozesse beziehen sich auf OperationalUnits, die sich auf Divisionen beziehen.VBA/SQL: Verschachtelte Abfrage, verwirrende Datenkonflikt

Die Abfrage Ich möchte:

SELECT ID, ProcessName FROM Processes WHERE Unit IN (SELECT ID FROM OperationalUnits WHERE Division='1');

Dies wirft mir immer ein "Typenkonflikt in Ausdruck" Fehler.

Ich habe durch das Brechen der Abfrage nach unten in die zwei Komponenten-Abfragen getestet:

SELECT ID FROM OperationalUnits WHERE Division='1';

Dies gibt eine einzelne ID, 2, das ist, was ich von meinen Testdaten erwarten.

SELECT ID, ProcessName FROM Processes WHERE Unit IN ('2');

Dies gibt einen einzelnen Prozess, der wieder genau das, was ich erwarte.

Aber wenn ich sie wieder zusammen in die Hauptabfrage kombinieren? Nee. Es scheint, dass das Problem darin besteht, dass die interne Abfrage [2] zurückgibt, während die externe Abfrage nur funktioniert, wenn sie ['2'] zurückgibt, aber das scheint nicht richtig für mich zu sein. Jede Hilfe wird geschätzt!

+3

Was sind Ihre Datentypen? Processes.Unit und OperationalUnits.ID? – n8wrl

+0

Processes.Unit ist der Datentyp 'Text', während OperationalUnits.ID vom Datentyp 'AutoNumber' ist. Ich hatte gedacht, dass, da Processes.Unit gebundene Spalte OperationalUnits.ID ist, dieser Datentyp durch ... passieren würde, aber vielleicht nicht? Die meisten dieser relationalen Felder in meiner Datenbank sind zweispaltige Abfragen, die an die ID der Quelltabelle gebunden sind, aber den Textnamen anzeigen. Das macht es einfacher, wenn ich Felder manuell ändern muss, ohne nachzusehen, was "3" bedeutet. –

+2

Offensichtlich kann ein Textfeld, Processes.Unit, nicht in einem AutoNumber-Bereich OperationalUnits.ID sein. Sie müssen etwas Typcasting tun. Ihr Schema ist auch durcheinander, wenn Sie ein Textfeld mit einem AutoNummer-Feld verknüpfen. – nicomp

Antwort

1

Der Zugriff wird nicht automatisch umgewandelt, außer in bestimmten Situationen. Wie in den Kommentaren erläutert, können Sie zwei Dinge tun, da Ihre Felder unterschiedliche Typen haben: Sie können mit einer Funktion umwandeln oder den Typ ändern.

zu werfen, erhalten Sie folgende verwenden:

SELECT ID, ProcessName FROM Processes WHERE Unit IN (SELECT CStr(ID) FROM OperationalUnits WHERE Division='1'); 
0

Sie können den Datentyp ändern in der SQL, obwohl es besser wäre, passende Datentypen zu haben, mit zu beginnen.

Zugang nicht in der Lage sein, die in der Entwurfsansicht beitreten darstellen, aber es wird es ausführen ganz gut:

SELECT Processes.ID 
     , ProcessName 
FROM Processes INNER JOIN OperationalUnits ON CLNG(Processes.Unit) = OperationalUnits.ID