保持特定日期和独特的NULLS

时间:2018-05-29 19:24:15

标签: sql sql-server

我有以下存储过程

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

1 个答案:

答案 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