选择多个案例并加入超时

时间:2018-09-07 03:48:54

标签: sql sql-server

对不起,标题,我不确定该放在哪里。

我正在尝试每年汇总案例和选择数据。我不确定这是否是正确的方法。就我而言,可以选择多个联接以检查该年和月的数据。

这是一月的示例查询。有12个查询(一月至十二月),我将它们全部合并。如果数据变大,我认为联接表会花费太长时间,并且查询超时。

SELECT TOP 1 1 AS INT_MONTH, 'Jan' AS STR_MONTH, 
           STATUS = CASE WHEN EXISTS (SELECT TOP 1 FIELD FROM TB 
                           WHERE MONTH=1 & YEAR=@year) THEN 'Ready' ELSE 'Not Yet' END,
           CREATED_BY = CASE WHEN EXISTS (SELECT TOP 1 FIELD FROM TB 
                           WHERE MONTH=1 & YEAR=@year) 
                        THEN 'Ready' ELSE '-' END,
           CREATED_DT = CASE WHEN EXISTS (SELECT TOP 1 FIELD FROM TB 
                           WHERE MONTH=1 & YEAR=@year) 
                        THEN (SELECT TOP 1 DT FROM FIELD WHERE MONTH=1 & YEAR=@year) ELSE NULL END,
           DATA1 = CASE WHEN EXISTS(SELECT TOP 1 FIELD FROM TB INNER JOIN TB2 ON TB2.F1 = TB.F1 WHERE TB2.MONTH=1 & TB2.YEAR=@year)
                     THEN 'Ready' ELSE 'Not Ready' END,
           DATA2 = CASE WHEN EXISTS (SELECT TOP 1 FIELD FROM TB INNER JOIN TB3 ON TB2.F1 = TB.F1 WHERE TB3.MONTH=1 & TB3.YEAR=@year) 
                      THEN 'Ready' ELSE 'Not Ready' END  

在我的真实查询中,案例内部有3个内部联接。我在这里简化它来解释问题。

预先感谢

2 个答案:

答案 0 :(得分:1)

您可以使用月份表来不使用工会

;WITH M AS (
    SELECT * FROM ( VALUES(1,'Jan'),(2,'Feb'),(3,'Mar'),(4,'Apr'),(5,'May'),(6,'Jın'),(7,'Jul'),(8,'Aug'),(9,'Sep'),(10,'Oct'),(11,'Nov'),(12,'Dec') ) M(INT_MONTH, STR_MONTH)
)
SELECT 
    M.INT_MONTH,
    M.STR_MONTH,
    CASE WHEN TB.FIELD IS NULL THEN 'Not Yet' ELSE 'Ready' END AS STATUS,
    CASE WHEN TB.FIELD IS NULL THEN '-' ELSE 'Ready' END AS CREATED_BY,
    CASE WHEN TB.FIELD IS NULL THEN NULL ELSE DT END AS CREATED_DT,
    CASE WHEN TB2.F1 IS NULL THEN 'Not Ready' ELSE 'Ready' END AS DATA1,
    CASE WHEN TB3.F1 IS NULL THEN 'Not Ready' ELSE 'Ready' END AS DATA2
FROM M
LEFT JOIN TB ON M.INT_MONTH = TB.MONTH AND TB.YEAR=@year
LEFT JOIN TB2 ON TB2.F1 = TB.F1 AND M.INT_MONTH = TB2.MONTH AND TB2.YEAR=@year
LEFT JOIN TB3 ON TB3.F1 = TB.F1 AND M.INT_MONTH = TB3.MONTH AND TB3.YEAR=@year

答案 1 :(得分:0)

根据我对查询的了解,可以使用JOINS修改查询。请在下面找到相应的查询。您可以了解如何相应地更改查询。

此外,我建议更改列名YEAR,MONTH,因为它们是sql server中的关键字。我将方括号括起来以避免语法错误。

SELECT TOP 1 1 AS INT_MONTH, 'Jan' AS STR_MONTH, 
           STATUS = CASE WHEN t.Field IS NOT NULL THEN 'Ready' ELSE 'Not Yet' END,
           CREATED_BY = CASE WHEN t.Field IS NOT NULL THEN 'Ready' ELSE '-' END,
           CREATED_DT = CASE WHEN t.Field IS NOT NULL 
                        THEN d.DT ELSE NULL END,
           DATA1 = CASE WHEN t2.F1 IS NOT NULL 
                     THEN 'Ready' ELSE 'Not Ready' END,
           DATA2 = CASE WHEN t2.F1 IS NOT NULL 
                      THEN 'Ready' ELSE 'Not Ready' END  
FROM TB AS t
LEFT JOIN DT as d
ON t.[Month] = d.[Month] and t.[year] = d.[year]
LEFT JOIN TB2 AS t2
ON t2.F1 = t.F1 and t2.[month] = t.[month] and t2.[year] = t.[year]
WHERE [Month] = 1 AND [YEAR] =  @year