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
希望这对以后的其他人有所帮助。
这个话题似乎有点过时,但 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
希望这对以后的其他人有所帮助。