首页 > 解决方案 > 保留特定日期和不同的空值

问题描述

我有以下存储过程

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))

我目前在过滤方面遇到问题。连接是拉出一个坦克列表,并与另一个列表中的任何提要值和日期连接。

我遇到麻烦的地方是在根据日期进行过滤时,我会丢失所有不包含值的坦克的所有不同的 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

标签: sqlsql-server

解决方案


您已将您的左连接变成了带有 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

推荐阅读