2017-12-08 6 views
0

基本的な考え方:特定の部門内に存在するすべてのプロセスの一覧が必要です。プロセスは部門に関連するOperationalUnitsに関連しています。VBA/SQL:ネストされたクエリ、バッフリングデータの不一致

は、クエリは、私がしたい:

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

これはいつも私に "式の型の不一致" エラーがスローされます。

私は2つのコンポーネントのクエリにダウンクエリを壊すことでテストしてみた:これは私が私のテストデータから何を期待され、単一のID、2を返し

SELECT ID FROM OperationalUnits WHERE Division='1';

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

これは私が期待するまさに再び単一のプロセスを返します。

しかし、それらを結合してメインクエリに戻すのであれば、いいえ。問題は内側のクエリが[2]を返し、外側のクエリが['2']を返す場合にのみ機能しますが、それは私にとって正しいことではないようです。どんな助けもありがとう!

+3

あなたのデータ型は何ですか?プロセス.UnitとOperationalUnits.ID? – n8wrl

+0

Processes.Unitはデータ型 'Text'ですが、OperationalUnits.IDはデータ型 'AutoNumber'です。私はProcesses.Unitのバインドされた列がOperationalUnits.IDなので、そのデータ型は通過すると思っていましたが、おそらくそうではありませんか?私のデータベースのこれらのリレーショナルフィールドのほとんどは、ソーステーブルのIDにバインドされているがテキスト名を表示する2列のクエリです。これは、 '3'の意味を調べずに手動でフィールドを変更する必要がある場合は、それを簡単に保ちます。 –

+2

明らかに、テキストフィールドProcesses.Unitは、オートナンバー型の範囲であるOperationalUnits.IDにすることはできません。タイプキャストをする必要があります。テキストフィールドをオートナンバーフィールドに関連付ける場合は、スキーマも混乱します。 – nicomp

答えて

1

特定の状況でない限り、アクセスは自動的に型をキャストしません。コメントで説明したように、フィールドには異なるタイプがあるため、関数を使用してキャストするか、タイプを変更することができます。キャストする

は、次のように使用することができます。

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

それはで開始するデータ型に一致している方が良いでしょうが、あなたは、SQL内のデータタイプを変更することができます。

のアクセスは、デザインビューに参加表すことができなくなりますが、それはうまくそれを実行します:

SELECT Processes.ID 
     , ProcessName 
FROM Processes INNER JOIN OperationalUnits ON CLNG(Processes.Unit) = OperationalUnits.ID 
関連する問題