在放置where子句后,SQL语句不起作用

时间:2012-11-19 22:41:05

标签: sql sql-server sql-server-2008 sql-server-2005

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

3 个答案:

答案 0 :(得分: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 ...这通常会使逻辑更容易理解。

答案 1 :(得分:1)

如果没有Event.Id,这将正确返回没有行。

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

但是那个过滤器在你的where子句中,所以整个查询只返回与过滤条件匹配的行。在这种情况下,意味着您将只看到event.id为8888的行,而不是其他任何内容。

如果您希望它显示事件表中的行,但只在event.id为8888时显示其他表中的信息,那么您可以将其作为连接的一部分。使用常量而不是来自另一个表的值作为join子句的一部分是有点不寻常,但是服务器很乐意接受它并且仅在表示该条件时才加入。当使用内连接时,这几乎没有用,但对于外连接,它可以帮助控制何时引入来自另一个表的数据。它看起来像:

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

答案 2 :(得分: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)

出于某种原因,这就是诀窍。使用过的查询设计器。