SQL Left Join 不包括所需的行

问题描述 投票:0回答:1

我正在尝试连接 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
  • only
    tblDailyData.TradeableDate
    tblDailyData.TradeableCode
    对应于 tblCalendar 天的行。

几个小时以来我一直在试图解决这个问题。我尝试过 ChatGPT、此处的资源、大量在线资源以及 MS Access 中的查询生成器。我怀疑我在

WHERE
ON
子句中做错了什么,但我不知道是什么。

感谢该小组可以提供的任何帮助。

sql ms-access left-join
1个回答
0
投票

不看数据,很难判断核心问题。这两行只有在

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
© www.soinside.com 2019 - 2024. All rights reserved.