0

我确定这是因为我不知道如何使用 LEFT JOIN,但我正在编写一个不返回 NULL 值的查询。这是查询:

CREATE TABLE #OrgMaster
(OrgName nvarchar(100))

INSERT INTO #OrgMaster (OrgName)
SELECT DISTINCT Organization
FROM StageReleaseCalendar_VW

SELECT SRC.Organization
, SRC.deploytype
, COUNT(SRC.deploytype) AS 'Deployment Count'
, DATEPART(m,SRC.actualstarttime) AS 'MonthNum'
, DATENAME(m,SRC.actualstarttime) AS 'MonthNam'
 FROM #OrgMaster TTOM LEFT OUTER JOIN StageReleaseCalendar_VW SRC 
 ON LEFT(TTOM.OrgName, LEN(TTOM.OrgName)) = SRC.Organization
WHERE DATEDIFF(m, SRC.scheduledstarttime, CURRENT_TIMESTAMP) BETWEEN 1 AND 2
AND completerelease = 1
AND deploytype IN ('Service Pack','Hot Fix')
AND cancelled = 0
GROUP BY SRC.Organization, SRC.deploytype,  DATEPART(m,SRC.actualstarttime), DATENAME(m,SRC.actualstarttime)

DROP TABLE #OrgMaster

共有四个组织:商业、消费者、合作伙伴和销售。创建临时表后,如果我再运行以下查询:

从#OrgMaster 中选择组织名称

结果如下:

商业消费者合作伙伴销售

合作伙伴在 7 月或 8 月没有任何类型的部署,所以我想要获得的是一组结果,其中包括合作伙伴的四个 NULL 记录——7 月的修补程序记录、8 月的修补程序记录、7 月的服务包记录,以及 8 月的服务包。相反,我得到一个结果集,该结果集仅限于那些实际上已经发生部署的条目。

任何人都可以在这里看到我不理解的内容吗?

谢谢。

4

3 回答 3

2

问题是您的 where 子句按(右)表中的字段限制数据。这不会给你空值。为此,我经常将我的 SELECT 封装在另一个 SELECT(嵌套)中,这样我就可以在(右)表中查询空值。

SELECT * FROM (
SELECT a.ID as AID, b.ID as BID from TableA a
LEFT JOIN TableB b
On ....
WHERE ...
) tmp Where BID is null
于 2013-09-18T22:45:05.443 回答
0

正确的查询

SELECT TTOM.OrgName 
, SRC.deploytype
, COUNT(SRC.deploytype) AS 'Deployment Count'
, DATEPART(m,SRC.actualstarttime) AS 'MonthNum'
, DATENAME(m,SRC.actualstarttime) AS 'MonthNam'
 FROM #OrgMaster TTOM LEFT OUTER JOIN StageReleaseCalendar_VW SRC 
 ON LEFT(TTOM.OrgName, LEN(TTOM.OrgName)) = SRC.Organization
WHERE SRC.Organization is null or 
 DATEDIFF(m, SRC.scheduledstarttime, CURRENT_TIMESTAMP) BETWEEN 1 AND 2
AND deploytype IN ('Service Pack','Hot Fix')
AND completerelease = 1
AND cancelled = 0
GROUP BY TTOM.OrgName, SRC.deploytype,  DATEPART(m,SRC.actualstarttime), DATENAME(m,SRC.actualstarttime)

另一种选择是使用 ISNULL 运算符保护 WHERE 子句中 SCR 表中的所有字段。

于 2013-09-18T23:28:17.210 回答
0

这对你有用。另外,我认为您也可以使用它来获取其他有用的信息。

DECLARE @OrgMaster as table(OrgName nvarchar(100),deptype nvarchar(100),MonthNum int,DeploymentCount int)
DECLARE @Loop1 int
DECLARE @Loop2 int

SELECT @Loop1 = 0, @Loop2 = 0

WHILE @Loop1 <> 2
BEGIN
    SELECT @Loop1 = @Loop1 + 1, @Loop2 = 0

    WHILE @Loop2 <> 2
    BEGIN
        SET @Loop2 = @loop2 + 1

        INSERT INTO @OrgMaster (OrgName,deptype,MonthNum)
        SELECT DISTINCT 
            Organization
            ,CASE WHEN @Loop1 = 1 THEN 'Service Pack' ELSE 'Hot Fix' END
            ,DATEPART(m,DATEADD(MONTH, -1 * @Loop2, GETDATE()))
        FROM StageReleaseCalendar_VW

    END
END


UPDATE @OrgMaster SET
    DeploymentCount = (SELECT COUNT(*) 
                        FROM StageReleaseCalendar_VW 
                        WHERE Organization = OrgName
                            AND deploytype = deptype
                            AND DATEPART(m,actualstarttime) = MonthNum
                            )

SELECT * from @OrgMaster where DeploymentCount = 0
于 2013-09-19T16:13:33.033 回答