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,它将消除任何NULL行,从而有效地将您OUTER JOIN转换为INNER 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,这将正确地不返回任何行。

一个可能的混淆来源可能是您在引入 Event 时使用了“右外连接”,因此您可能希望它仍然显示来自另一个表的行,即使使用过滤器。

但是该过滤器位于您的 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 回答