LEFT 连接不从 LEFT table 返回所有行

LEFT join not returning all rows from LEFT table

这个话题似乎有点过时,但 none 我找到的答案对我有用。

我想加入两个 tables,获取 table DAYS 中的所有值,这是一列数字 1 到 30 和一列连接第二个 table 的值数据如下:

Ref  Week_Comm  Date        Name            Adj_Type      Hours Description Sick_Note   Deleted

223  04-Apr-17  04-Apr-17   Joe Bloggs      Absence          4  Sickness    RECD    
112  04-Apr-17  05-Apr-17   Joe Bloggs      Absence          7  Sickness    RECD    
196  04-Apr-17  06-Apr-17   Joe Bloggs      Absence          7  Sickness    RECD    
197  11-Apr-17  11-Apr-17   Fred Flintstone Holiday          7                  

我想要的结果看起来像这样:

Day         April
1   
2   
3   
4           A 4Hrs
5           A 7Hrs
6           A 7Hrs
7   
8
etc to 30   

串联效果很好,但我只能从与右边匹配的地方得到结果 table。

我正在 Excel VBA 中创建 SQL 作为字符串,并使用 ODBC 连接到 return 数据。 table 包含在同一个电子表格中。

我的第一次尝试如下

SELECT DAYS.Day, (LEFT(DATA.Adj_Type,1) + ' ' + Cstr(DATA.Hours) + ' Hrs') as April 
FROM DAYS 
LEFT OUTER JOIN DATA ON (DAYS.Day = DAY(DATA.Date) 
WHERE (MONTH(DATA.Date)=4) AND (DATA.Deleted Is Null) AND (DATA.Name='Joe Blogs')) 
ORDER BY DAYS.Day

这为我提供了内部联接的结果,即它没有 return 我左边 table DAYS

的所有值

按照本论坛上类似问题的回答,我尝试用 AND 替换 WHERE,如下所示

SELECT DAYS.Day, (LEFT(DATA.Adj_Type,1) + ' ' + Cstr(DATA.Hours) + ' Hrs') as April 
FROM DAYS 
LEFT OUTER JOIN DATA ON ((DAYS.Day = DAY(DATA.Date) 
AND  (MONTH(DATA.Date)=4) AND (DATA.Deleted Is Null) AND (DATA.Name='Joe Blogs')) 
ORDER BY DAYS.Day

这 return 没有数据,我收到错误“不支持 JOIN EXPRESSION”

然后我尝试为我的 table 选择我想要的数据,然后加入它们:

SELECT DAYS.Day 
FROM DAYS AS A 
LEFT JOIN (SELECT DAY(DATA.Date) AS Day, (LEFT(DATA.Adj_Type,1) + ' ' + Cstr(DATA.Hours) + ' Hrs') as April 
FROM DATA
WHERE (MONTH(DATA.Date)=4) AND (DATA.Deleted Is Null) AND (DATA.Name='Joe Blogs')) as B 
ON A.Day = B.Day 

然后我收到错误消息

Syntax error in FROM clause

我哪里错了??我在这方面非常新手,我的大部分信息都是通过 google

获得的

提前致谢 - 贾斯汀

编辑我已经编辑掉了额外的别名(如上所述),但仍然得到相同的结果。

你的第二个查询是正确的,只有MONTH(DATA.Date)=4不能用于连接条件。而是像这样将它移回 WHERE 子句:

WHERE (MONTH(DATA.Date)=4 OR DATA.Date IS NULL)

现在已经解决了。我问题中的第二个 SQL 语句实际上是正确的,但是因为它从左侧 table 获取空数据到我的连接字符串中,所以它没有带回任何数据,因为 "invalid use of null"错误。我原以为串联工作正常,但这只是在通过错误使用 WHERE 排除空数据的语句上。

这是我的最终代码。

SELECT DAYS.Day, IIF(DATA.Hours is null, DATA.Hours, (LEFT(DATA.Adj_Type,1) + ' ' + Cstr(DATA.Hours) + ' Hrs')) 
FROM DAYS LEFT OUTER JOIN DATA ON (DAYS.Day = DAY(DATA.Date) AND (MONTH(DATA.Date)=4) AND (DATA.Deleted Is Null) AND (DATA.Name='Joe Bloggs')) 
ORDER BY DAYS.Day 

希望这对以后的其他人有所帮助。