Excel 左联接不返回左表中的所有行

Excel 左联接不返回左表中的所有行,excel,vba,sql-server-2005,left-join,Excel,Vba,Sql Server 2005,Left Join,这个话题似乎有点浮出水面,但我发现没有一个答案对我有用 我想连接两个表,获取表DAYS中的所有值,这是一列数字1到30,另一列连接第二个表DATA中的值,如下所示: Ref Week_Comm Date Name Adj_Type Hours Description Sick_Note Deleted 223 04-Apr-17 04-Apr-17 Joe Bloggs Absence 4 Sickne

这个话题似乎有点浮出水面,但我发现没有一个答案对我有用

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

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   
WHERE (MONTH(DATA.Date)=4 OR DATA.Date IS NULL)
连接工作得很好,但我只从与正确表匹配的地方得到结果

我正在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
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
这会给我一个内部联接的结果,即它不会返回我左边表中的所有值

在这个论坛上,我对类似问题的回答如下,我尝试用和替换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) 
WHERE (MONTH(DATA.Date)=4) AND (DATA.Deleted Is Null) AND (DATA.Name='Joe Blogs')) 
ORDER BY DAYS.Day
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
这将不返回任何数据,并且出现错误“不支持联接表达式”

然后,我尝试为我的表选择所需的数据,然后连接它们:

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子句中的语法错误

我哪里做错了??我对这一切都是新手,我的大部分信息都是通过谷歌获得的

提前谢谢-贾斯汀


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

您的第二个查询是正确的,只有MONTHDATA.Date=4不能用于联接条件。而是将其移回WHERE子句,如下所示:

Day         April
1   
2   
3   
4           A 4Hrs
5           A 7Hrs
6           A 7Hrs
7   
8
etc to 30   
WHERE (MONTH(DATA.Date)=4 OR DATA.Date IS NULL)

这个问题现在已经解决了。我的问题中的第二条SQL语句实际上是正确的,但因为它将左表中的null数据带到连接字符串中,所以由于无效使用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 

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

似乎您的表名为DAYS and DATA,为什么要在FROM子句中重复DATA DATA和DAYS DAYS?正如marcinszaleniec所评论的,但特别是对于FROM DAYS DAYS这一行,无论何时引用正确的表,您都需要使用join子句,不是where子句。如果在where子句中对正确的表使用筛选器,它会将外部联接转换为内部联接,因为它知道其中的值是否与筛选器匹配的唯一方法是是否存在匹配的行。当然,您首先需要了解基本语法。为什么要将天别名为天或A?我一直使用数据数据语法,我认为它来自于使用ms query。我现在已经删除了该语法,并且仍然在from子句中出现语法错误。我现在使用SELECT DAYS。Day from DAYS作为左连接SELECT DAYDATA。Date as Day,LEFTDATA.Adj_Type,1+''+CstrDATA.Hours+'Hrs'as April,其中MONTHDATA.Date=4,DATA.Deleted为Null,DATA.Name='Joe Blogs'as B ON A.Day=B.Day感谢ItsLex-我刚刚尝试了以下操作,但没有返回任何数据,这是什么意思?选择DAYS.Day FROM DAYS AS LEFT JOIN选择DAYDATA.Date AS Day,LEFTDATA.Adj_Type,1+''+CstrDATA.Hours+'Hrs'AS April,其中MONTHDATA.Date=4或Data.Date为NULL,Data.Deleted为NULL,Data.Name='Joe Blogs AS B ON A.Day=B.DayNo,这是您的第三个查询。请注意OR语句周围的括号。我已经尝试了MONTHDATA.Date=4和DATA.Deleted为Null和DATA.Name='Joe Bloggs'或DATA.Date为Null,它只是再次返回内部联接值。最后,我尝试了MONTHDATA.Date=4或DATA.Date为Null和DATA.Deleted为Null和DATA.Name='Joe Bloggs'并再次获得内部联接值我的理解是我不能在正确的表中使用WHERE子句。但我相信一定有办法。