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
答案 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)
出于某种原因,这就是诀窍。使用过的查询设计器。