【问题标题】:How to write this sql query efficiently in this case在这种情况下如何高效地编写这个sql查询
【发布时间】:2014-06-26 04:46:19
【问题描述】:

在这里,我有一个类似下面的查询,正在循环子 ID 并将其传递给该查询并获得适当的结果。这里我有 33 个子 ID,所以这个查询的结果包含 33 行

DECLARE @DATETIMENOW DATETIME  
SET @DATETIMENOW = GETDATE()-7 

SELECT COUNT(1) FROM  BKA.CHILDEVENTS CHE JOIN BKA.CHILDEVENTPROPERITIES CHEP ON CHEP.EVENTID = CHE.EVENTID  
                      WHERE (CHE.TYPE = 'ACCIDENT' OR (CHE.TYPE = 'BREAK' AND CHEP.PROPERTY = 'SUCCESS' AND CHEP.PROPERTYVALUE = 'FALSE'))  
                      AND CHE.CHILDID = @CHILDID AND CHE.ADDDATE BETWEEN DATEADD(DD, -(DATEPART(DW, @DATETIMENOW-7)-1), @DATETIMENOW-7) AND  
                      DATEADD(DD, 7-(DATEPART(DW, @DATETIMENOW-7)), @DATETIMENOW-7) AS PREVIOUSWEEKACCIDENTS

在这里,我尝试在此查询中使用 join 而不是循环 childid,但在一行中得到结果。我在这做错了什么

DECLARE @DATETIMENOW DATETIME  
SET @DATETIMENOW = GETDATE()-7 
SELECT COUNT(1) FROM  BKA.CHILDEVENTS CHE JOIN BKA.CHILDEVENTPROPERITIES CHEP 
                      ON CHEP.EVENTID = CHE.EVENTID 
                      JOIN  BKA.CHILDINFORMATION CHINFO
                      ON CHE.CHILDID = CHINFO.CHILDID
                      WHERE (CHE.TYPE = 'ACCIDENT' OR (CHE.TYPE = 'BREAK' AND CHEP.PROPERTY = 'SUCCESS' AND CHEP.PROPERTYVALUE = 'FALSE'))  
                      AND CHE.ADDDATE 
                      BETWEEN DATEADD(DD, -(DATEPART(DW, @DATETIMENOW-7)-1), @DATETIMENOW-7) AND  
                      DATEADD(DD, 7-(DATEPART(DW, @DATETIMENOW-7)), @DATETIMENOW-7)

有什么建议吗?

【问题讨论】:

    标签: sql-server-2008 tsql join


    【解决方案1】:

    您需要添加一个 GROUP BY 子句:

    SELECT  CHINFO.CHILDID
          , COUNT(1)
    FROM    BKA.CHILDEVENTS CHE
            JOIN BKA.CHILDEVENTPROPERITIES CHEP ON CHEP.EVENTID = CHE.EVENTID
            JOIN BKA.CHILDINFORMATION CHINFO ON CHE.CHILDID = CHINFO.CHILDID
    WHERE   ( CHE.TYPE = 'ACCIDENT'
              OR ( CHE.TYPE = 'BREAK'
                   AND CHEP.PROPERTY = 'SUCCESS'
                   AND CHEP.PROPERTYVALUE = 'FALSE'
                 )
            )
            AND CHE.ADDDATE BETWEEN DATEADD(DD,
                                            -( DATEPART(DW, @DATETIMENOW - 7) - 1 ),
                                            @DATETIMENOW - 7)
                            AND     DATEADD(DD,
                                            7 - ( DATEPART(DW, @DATETIMENOW - 7) ),
                                            @DATETIMENOW - 7)
    GROUP BY CHINFO.CHILDID
    

    【讨论】:

    • 但不显示空值..我尝试了左外连接,但仍然没有得到结果中的空值
    • 在哪里将左连接更改为连接
    【解决方案2】:

    where 中的值将使外连接无效

    SELECT CHE.CHILDID
         , COUNT(1)
      FROM BKA.CHILDEVENTS CHE
      LEFT JOIN BKA.CHILDEVENTPROPERITIES CHEP 
        ON CHEP.EVENTID = CHE.EVENTID
       AND ( CHE.TYPE = 'ACCIDENT'
              OR ( CHE.TYPE = 'BREAK'
                   AND CHEP.PROPERTY = 'SUCCESS'
                   AND CHEP.PROPERTYVALUE = 'FALSE'
                 )
           )
       AND CHE.ADDDATE BETWEEN DATEADD(DD,
                                            -( DATEPART(DW, @DATETIMENOW - 7) - 1 ),
                                            @DATETIMENOW - 7)
                           AND DATEADD(DD,
                                            7 - ( DATEPART(DW, @DATETIMENOW - 7) ),
                                            @DATETIMENOW - 7)    
    GROUP BY CHE.CHILDID
    

    【讨论】:

    • +1 给 Suart,因为我使用了他的 TSQL。这个问题在评论中有一个小时,所以我继续回答。
    【解决方案3】:
              DECLARE @DATETIMENOW DATETIME  
              SET @DATETIMENOW = GETDATE()
    
                  SELECT  B.WEEK FROM BKA.CHILDINFORMATION CI LEFT OUTER JOIN 
    
                  (SELECT Distinct CHINFO.CHILDID,COUNT(*)  as week FROM  BKA.CHILDINFORMATION CHINFO               
                   JOIN  BKA.CHILDEVENTS CHE 
                                ON CHE.CHILDID = CHINFO.CHILDID                                                       
                   JOIN BKA.CHILDEVENTPROPERITIES CHEP 
                                ON  CHE.EVENTID = CHEP.EVENTID                         
                  WHERE 
                              (CHE.TYPE = 'ACCIDENT' OR (CHE.TYPE = 'POTTYBREAK' AND CHEP.PROPERTY = 'SUCCESS' 
                              AND CHEP.PROPERTYVALUE = 'FALSE'))  
                                AND 
                                CHE.ADDDATE 
                                BETWEEN DATEADD(DD, -(DATEPART(DW, @DATETIMENOW-14)-1), @DATETIMENOW-14) AND  
                                DATEADD(DD, 7-(DATEPART(DW, @DATETIMENOW-14)), @DATETIMENOW-14)      group by CHINFO.CHILDID) b
                                on CI.ChildID = b.ChildID
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2013-04-25
      • 1970-01-01
      • 2021-10-28
      • 2021-11-30
      • 2011-01-09
      • 2021-05-21
      相关资源
      最近更新 更多