LEFT join不从LEFT表

时间:2017-12-01 14:24:24

标签: excel vba sql-server-2005 left-join

这个主题似乎有点出现,但我找到的答案都没有对我有用。

我想连接两个表来获取表DAYS中的所有值,这是一列数字1到30以及一个列连接来自第二个表的值的列,如下所示:

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   

连接工作正常,但我只能从与右表匹配的地方得到结果。

我在Excel VBA中创建SQL作为字符串并使用ODBC连接返回数据。这些表包含在同一个电子表格中。

我的第一次尝试如下

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

这给了我一个内连接的结果,即它不会返回我左表DAYS中的所有值

在此论坛上对类似问题的回答后,我尝试将AND替换为AND,如下所示

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

这不返回数据,我收到错误“JOIN EXPRESSION NOT SUPPORTED”

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

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 

我收到错误消息

  

FROM子句中的语法错误

我哪里错了?我对这一切都非常新手,并通过谷歌获取我的大部分信息

提前致谢 - 贾斯汀

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

2 个答案:

答案 0 :(得分:0)

您的第二个查询是在正确的轨道上,只有MONTH(DATA.Date)=4无法在加入条件中使用。而是将其移回WHERE子句,如下所示:

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

答案 1 :(得分:0)

现在已经解决了。我的问题中的第二个SQL语句实际上是正确的,但是因为它将左表中的空数据转换为我的连接字符串,所以它没有带来任何数据,因为"无效使用null"错误。我原以为串联工作正常,但这只是在通过错误使用WHERE排除Null数据的语句中。

这是我的最终代码。

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 

希望将来可以帮助其他人。