1
SELECT     
   Event.Id, Event.Title, Event.StartDateTime, Event.DeadlineDate, 
   [File].ShortFileName, People.Initials
FROM         
   People 
INNER JOIN
   People2Event ON People.Id = People2Event.PeopleId 
RIGHT OUTER JOIN
   [File] 
INNER JOIN
   File2Event ON [File].Id = File2Event.FileId 
RIGHT OUTER JOIN
   Event ON File2Event.EventId = Event.Id ON People2Event.EventId = Event.Id

私はこの声明を持っています。それはすべてのレコードを印刷します。以下は機能しません。where 関数を使用した同じステートメントです。誰も修正方法を知っていますか?

SELECT     
   Event.Id, Event.Title, Event.StartDateTime, Event.DeadlineDate, 
   [File].ShortFileName, People.Initials
FROM         
   People 
INNER JOIN
   People2Event ON People.Id = People2Event.PeopleId 
RIGHT OUTER JOIN
   [File] 
INNER JOIN
   File2Event ON [File].Id = File2Event.FileId 
RIGHT OUTER JOIN
   Event ON File2Event.EventId = Event.Id ON People2Event.EventId = Event.Id
WHERE 
   Event.ID = 8888
4

3 に答える 3

7

編集

AndriyM が指摘するように、WHERE節にあった条件は の右側にあったためRIGHT OUTER JOIN、 に移動しONても効果はありません。OPは、彼が問題を解決したと言うものだけを含むクエリを投稿したINNER JOINので、彼のクエリには他の問題があったに違いありません.


WHEREの一部であるテーブルの句にフィルタを追加すると、すべての行OUTER JOINが削除され、効果的に に変わります。NULLOUTER JOININNER JOIN

WHERE句に条件を配置する代わりに、次のように移動しますON

File2Event ON [File].Id = File2Event.FileId RIGHT OUTER JOIN
Event 
    ON File2Event.EventId = Event.Id 
    AND People2Event.EventId = Event.Id
    AND Event.ID = 8888

また、スタイルに関するヒントとして、 の使用を避けRIGHT JOIN、代わりに使用するクエリを書き直しますLEFT JOIN。これにより、通常、ロジックを理解しやすくなります。

于 2012-11-19T22:43:29.063 に答える
1

Event.Id がない場合、これは適切に行を返しません。

考えられる混乱の原因の 1 つは、イベントを取り込むときに「右外部結合」を使用しているため、フィルターを使用しても他のテーブルの行が表示されると予想される可能性があることです。

ただし、そのフィルターは where 句に含まれているため、クエリ全体として、フィルターの条件に一致する行のみが返されます。この場合、event.id が 8888 の行のみが表示され、それ以外は表示されないことを意味します。

event.id が 8888 のときに、イベント テーブルの行を表示し、他のテーブルの情報のみを表示する場合は、それを結合の一部として配置できます。結合句の一部として別のテーブルの値の代わりに定数を使用することは少し珍しいですが、サーバーは喜んでそれを受け入れ、その条件が意図されている場合にのみ結合します。内部結合を使用する場合、これはほとんど役に立ちませんが、外部結合の場合、別のテーブルからデータが取り込まれるタイミングを制御するのに役立ちます。次のようになります。

SELECT     Event.Id, Event.Title, Event.StartDateTime, Event.DeadlineDate, [File].ShortFileName, People.Initials
FROM         People INNER JOIN
                      People2Event ON People.Id = People2Event.PeopleId RIGHT OUTER JOIN
                      [File] INNER JOIN
                      File2Event ON [File].Id = File2Event.FileId RIGHT OUTER JOIN
                      Event ON File2Event.EventId = Event.Id 
                      ON People2Event.EventId = Event.Id
                          AND Event.ID = 8888
于 2012-11-19T22:50:38.080 に答える
0
SELECT     Event.Id, Event.Title, Event.StartDateTime, Event.DeadlineDate, [File].ShortFileName, People.Initials
FROM         [File] INNER JOIN
                      File2Event ON [File].Id = File2Event.FileId INNER JOIN
                      People INNER JOIN
                      People2Event ON People.Id = People2Event.PeopleId INNER JOIN
                      Event ON People2Event.EventId = Event.Id ON File2Event.EventId = Event.Id
WHERE     (Event.Id = 8888)

これは何らかの理由でトリックを行います。使用されたクエリ デザイナー。

于 2012-11-19T22:59:26.820 に答える