我正在尝试连接 2 个表,其中左表中的所有数据都会出现,并且只出现右表中匹配的数据 - 应该是一个简单的
LEFT JOIN
。但我要么得到只有两个表中的数据匹配时才出现的结果,要么得到左表中的一些数据和右表中匹配的一组正确数据。
这是代码:
SELECT
tblCalendar.dDate, tblCalendar.dDay,
tblDailyData.TradeableDate, tblDailyData.TradeableCode
FROM
tblCalendar
LEFT JOIN
tblDailyData ON tblCalendar.[dDate] = tblDailyData.[TradeableDate]
WHERE
(((tblDailyData.TradeableCode) = "MSFT"))
OR (((tblDailyData.TradeableDate) IS NULL)
AND ((tblDailyData.TradeableCode) IS NULL))
ORDER BY
tblCalendar.dDate;
正确的输出应该是(见图):
tblCalendar.dDate
和 tblCalendar.dDay
行tblDailyData.TradeableDate
和 tblDailyData.TradeableCode
对应于 tblCalendar 天的行。几个小时以来我一直在试图解决这个问题。我尝试过 ChatGPT、此处的资源、大量在线资源以及 MS Access 中的查询生成器。我怀疑我在
WHERE
和 ON
子句中做错了什么,但我不知道是什么。
感谢该小组可以提供的任何帮助。
不看数据,很难判断核心问题。这两行只有在
NULL
中有 tblCalendar.dDate
时才会连接。查询中的一个简单测试是执行 FULL OUTER JOIN
而不是 LEFT JOIN
。
OR (((tblDailyData.TradeableDate) IS NULL)
AND ((tblDailyData.TradeableCode) IS NULL))
如果需要获取
NULL
tblDailyData.TradeableDate
,可以先以RIGHT JOIN
到tblCalendar
为一组,然后从FULL OUTTER JOIN
到tblCalendar
到该组来处理。
WITH filteredDailyData AS(
SELECT
tblDailyData.TradeableDate ,
tblDailyData.TradeableCode
FROM tblDailyData
WHERE
tblDailyData.TradeableCode = "MSFT"
OR (tblDailyData.TradeableDate IS NULL
AND tblDailyData.TradeableCode IS NULL)
),
filteredCalendarDailyData AS(
SELECT
tc.dDate,
tc.dDay,
fdr.TradeableDate,
fdr.TradeableCode
FROM filteredDailyData AS fdr
RIGHT JOIN tblCalendar AS tc ON
fdr.TradeableDate = fdr.dDate
),
fullCalendarFilteredDailyData AS(
SELECT
c.dDate,
c.dDay,
fcdd.TradeableDate,
fcdd.TradeableCode
FROM tblCalendar AS c
FULL OUTER JOIN filteredCalendarDailyData AS fcdd ON
c.dDate = fcdd.dDate
)
SELECT * FROM fullCalendarFilteredDailyData