我有以下存储过程
ALTER PROCEDURE [dbo].[sp_GetFeedDate10_TEST]
-- sp_GetFeedDate10_TEST '05/30/2018'
@daycurrent DATE
AS
BEGIN
SELECT
TANK.Name, TANK.Tank_Pond_uID,
FEED.FeedValue, FEED.Date
FROM
aa_Tanks_Ponds TANK
LEFT JOIN
aa_Feed_Chart FEED ON TANK.Tank_Pond_uID = FEED.Tank_Pond_uID
WHERE
TANK.Site_Name = 'Dry Creek' --and (FEED.Date = DATEADD(DAY, -10, @daycurrent))
ORDER BY
TANK.Tank_Pond_uID
END
我评论了“和
(FEED.Date = DATEADD(DAY, -10, @daycurrent))
我目前遇到过滤问题。该联接正在提取一个坦克列表,并与其他列表中的任何Feed值和日期相关联。
遇到麻烦的地方是根据日期进行过滤时,我会丢失所有不包含值的坦克的所有不同NULLS。保持结果与TANK表的行和顺序相同非常重要。
这是第一张表的例子:
Name Tank_Pond_uID
--------------------
B01 DCB01
B02 DCB02
B03 DCB03
B04 DCB04
B05 DCB05
第二个表的示例:
Site_Name Tank_Pond_uID Date FeedValue
--------------------------------------------------
Dry Creek DCB01 2018-05-20 90
Dry Creek DCB02 2018-05-20 90
Dry Creek DCB03 2018-05-20 90
我使用日期运行上述存储过程:
sp_GetFeedDate10_TEST '05/30/2018'
(我知道日期并不重要,因为注释部分需要它),我得到以下结果:
Name Tank_Pond_uID FeedValue Date
-----------------------------------------------
B01 DCB01 90 2018-05-20
B01 DCB01 90 2018-05-21
B01 DCB01 90 2018-05-22
B02 DCB02 90 2018-05-20
B02 DCB02 90 2018-05-21
B02 DCB02 90 2018-05-22
B03 DCB03 NULL NULL
B04 DCB04 NULL NULL
B05 DCB05 NULL NULL
当我将注释部分添加回Store过程并再次运行时,我得到以下结果:
Name Tank_Pond_uID FeedValue Date
-----------------------------------------------
B01 DCB01 90 2018-05-20
B02 DCB02 90 2018-05-20
我希望预期的结果是保留左行并仍然过滤日期:
预期表结果的示例:
Name Tank_Pond_uID FeedValue Date
-----------------------------------------------
B01 DCB01 90 2018-05-20
B02 DCB02 90 2018-05-20
B03 DCB03 NULL NULL
B04 DCB04 NULL NULL
B05 DCB05 NULL NULL
答案 0 :(得分:2)
您已将左连接转换为内部联接,其中包含where子句中的谓词。将日期谓词移动到连接,这将起作用。
select TANK.Name
, TANK.Tank_Pond_uID
, FEED.FeedValue,FEED.Date
from aa_Tanks_Ponds TANK
LEFT JOIN aa_Feed_Chart FEED ON TANK.Tank_Pond_uID = FEED.Tank_Pond_uID
and FEED.Date = DATEADD(DAY, -10, @daycurrent)
where TANK.Site_Name = 'Dry Creek'
order by TANK.Tank_Pond_uID