即使JOINed表中没有相应的记录,如何从一个表中获取所有记录?

时间:2013-10-21 07:53:28

标签: sql sql-server

我有一个[Users]表,在此示例中进行了简化:

uID | uName | uSalesRep
----+-------+----------
  1 | John  | 1
  2 | Bob   | 1
  3 | Fred  | 1
  4 | Stu   | 1

销售表[Activity]

aID | aDate      | aUserID | aText
----+------------+---------+---------------
  1 | 2013-10-09 |       1 | John did stuff
  2 | 2013-10-14 |       2 | Bob did stuff
  3 | 2013-10-17 |       3 | Fred did stuff

我想获得一份所有销售代表的列表,以及他们2013年10月14日开始的一周的活动,以下是我尝试这样做的方式:

SELECT uID, Name, aID, aDate, aText
FROM [Users]
LEFT JOIN [Activity] ON uID = UserID
WHERE (aDate >= '2013-10-14' OR aDate = NULL)
AND (aDate <= '2013-10-18' OR aDate = NULL)
AND uSalesRep = 1

我使用LEFT JOIN希望检索所有代表,但我认为这被aDate要求所覆盖。包括aDate = NULL包括根本没有活动的代表,但是具有超出指定范围的活动的代表将被省略。

如果他们记录的任何活动,我怎样才能至少获得所有代表一次?

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

当过滤器应用于连接表时,您需要将过滤器放在join上,而不是where子句

SELECT uID, Name, aID, aDate, aText
FROM [Users]
LEFT JOIN [Activity] ON uID = UserID
AND (aDate >= '2013-10-14')
AND (aDate <= '2013-10-18')
WHERE uSalesRep = 1