2009-05-01 8 views
1

実際のスキーマはもう少し複雑ですが、以下は私が少しだけ簡単に理解できるはずです。一つのテーブルで同じテーブルの2つの異なるレコードの一部を1つのクエリで返す

私は仕事のリストを持っている:

 
Job Status Open date Close date 
1  Closed 04/29/2009 04/30/2009 
2  Open  04/30/2009 
3  Open  04/30/2009 

..and他に私が仕事に関連付けられている注釈のリストを持っている:

 
ID Job Type Date  Text 
1 1  Open  04/29/2009 Please fix my printer 
2 1  Close 04/30/2009 Printer fixed 
3 2  Open  04/30/2009 Please fix my monitor 
4 2  Update 04/30/2009 Part required 
5 3  Open  05/01/2009 Please fix my mouse 

各ジョブは "必要がありますオプションで1つまたは複数の「更新」メモ、およびオプションで「閉じる」メモを開くことができます。明らかに、ジョブフィールドには1対多の関係があります。

私は何をしたいのですが、ノートを開いて、ジョブ、オープン日のリストを返す単一のクエリであると、このように存在する場合、閉じたノート、:

 
Job Status Open date Open note    Close note 
1  Closed 04/29/2009 Please fix my printer Printer fixed 
2  Open  04/30/2009 Please fix my monitor 
3  Open  04/30/2009 Please fix my mouse 

これを行うことで、私の試み私はAccesの中でSQLを使用してい

 
Job Status Open date Open note    Close note 
1  Closed 04/29/2009 Please fix my printer 
1  Closed 04/29/2009       Printer fixed 
2  Open  04/30/2009 Please fix my monitor 
3  Open  05/01/2009 Please fix my mouse 

 
Job Status Open date Open note    Close note 
1  Closed 04/29/2009 Please fix my printer 
1  Closed 04/29/2009       Printer fixed 
2  Open  04/30/2009 Please fix my monitor 
2  Open  04/30/2009 
3  Open  05/01/2009 Please fix my mouse 
3  Open  05/01/2009 

..or:私は、次で終わるので、常に失敗最終的なクエリはADO経由のExcelフロントエンドからのものになりますが、私はAccess内からこれを取得しようとしています。

答えて

7

私はそれを編集しようとしたときにアクセス、しかしその後、 "結合式がサポートされていない" wobblerを投げ、またはExcelからADODB経由でクエリを実行します。

MDBを閉じて再オープンするだけで十分でしたが、SQLまたはQBEビューで表示/編集しようとすると、例外がスローされ始めます。最終的に私は "コンパクト&修理"の後でさえ、クエリを開いたり編集したりすることができませんでした。おそらくAccess内で何らかの内部破損が起きていました。

奇妙なことに、奇妙なことに、私はクエリ(SELECT * FROM noteReport;) - 奇妙なことを参照することによってそれを動作させることができました。正確なクエリを再作成して再び機能させることができなかったため、私の最初の成功は偶然だったようです。

しかし、私は最終的には、以下を目的のレポートを複製することができました:

SELECT a.callReference, b.callPriority, datevalue(INT(a.openedDT)), 
    b.callerFirstName & ' ' & b.callerSurname AS Caller, c.noteText, d.noteText 
FROM ((tblMain AS a 
    INNER JOIN tblCalldetails AS b ON a.callreference=b.callReference) 
    LEFT JOIN tblNotes AS c ON a.callReference=c.callReference) 
    LEFT JOIN tblNotes AS d ON a. callReference =d.callReference 
WHERE a.status = 'Closed' 
    AND c.noteType='Open' 
    AND d.noteType='Closing' 
    AND INT(a.closedDT) = #5/1/2009#; 

は限りグーグル経由でこれを見つけることが誰のためとしての私の利益のためとして、ここではこれを投稿します。

+0

美しいですが、これは私の実際の例にうってつけです。 – Lunatik

+0

ああ、私は何かを忘れていたことを知っていた –

+0

ええ、それは起こる。私が気づくまで私は答えに行くつもりもなかった。 – tpdi

0

基本的には、ジョブテーブルをクエリの駆動テーブルとして使用し、次にNoteテーブルへの2つの結合が必要です。最初の結合は、「開いた」注釈の内部結合です。常に内側の注釈が存在するため、内部結合です。 2番目の結合は、「閉じる」注釈の外部結合です。これは、終了音がない可能性があるためです。このようなもの:

select job.job, status, opendate, opennote.note, closenote.note from 
    job left inner join note opennote on opennote.job = job.job 
     left outer join note closenote on closenote.job = job.job 

おそらくアクセスの構文は多少異なりますが、それは一般的な考えです。

select a.job, a.status, a.opendate, 
     b.note as opennote, c.note as closenote 
from job a 
    join note b on (a.job = b.job and b.type = 'Open') 
    left outer join note c on (a.job = c.job and c.type = 'Closed'); 
0

私は、コマンドを作成したときtpdiによって提案された解決策が働い:情報は言ったが、それはそれぞれ、開いて、ノートを閉じたために参加を制限する述語なくても正常に動作しませんどのような1800

関連する問題