0

所以我有这个查询:

SELECT 
    AED.aId, CJ.* 
FROM 
    AED
        LEFT JOIN 
            Cronjob as CJ 
                ON CJ.aID = AED.aId 
WHERE 
                AED.aStatus = '1'
        AND 
                (
                        CJ.cjDatum < CURRENT_DATE - INTERVAL 14 DAY 
                AND
                        AED.aRegistratie > CURRENT_DATE - INTERVAL 10 YEAR
                )
        OR
                ( 
                        CJ.cjStatus = '9' 
                OR 
                        CJ.cjStatus = '2'
                )

问题是,Cronjob 表是空的,如果它是空的,仍然想给所有来自 AED 的 ID,状态为 1

我找不到任何使用完整的东西,所以我希望你们能帮助!

4

3 回答 3

4

您应该将所有 CJ 条件移动到连接的 ON 子句中。

ON (
  CJ.aID = AED.aId 
  AND (cjStatus in ('2','9') OR cjDatum < CURRENT_DATE - INTERVAL 14 DAY ))

选项二是将它们留在 WHERE 中,但要为 cjStatus 和朋友为 NULL 的情况做出规定(如果没有找到匹配项,它们将是 NULL)。

OR cjStatus IS NULL
于 2013-04-19T08:57:03.330 回答
2

当没有关联的 CronJob 时,过滤器CJ.cjStatus = '9'(例如)返回 false,因为CJ.cjStatus为 null。这就是 LEFT JOIN 所做的,当没有对应关系时它返回空字段。

要在要 LEFT JOIN 的表上添加过滤器,过滤器子句必须在连接子句中,如下所示:

SELECT AED.aId
     , CJ.* 
FROM AED
    LEFT JOIN Cronjob as CJ 
        ON CJ.aID = AED.aId 
        AND (CJ.cjDatum < CURRENT_DATE - INTERVAL 14 DAY 
             AND AED.aRegistratie > CURRENT_DATE - INTERVAL 10 YEAR
             )
        OR (CJ.cjStatus = '9' OR CJ.cjStatus = '2')
WHERE AED.aStatus = '1'
于 2013-04-19T09:02:41.103 回答
0

添加OR (CJ.aid is null)到条件的 AND 部分:

SELECT 
    AED.aId, CJ.* 
FROM 
    AED
        LEFT JOIN 
            Cronjob as CJ 
                ON CJ.aID = AED.aId 
WHERE 
                AED.aStatus = '1'
        AND 
             (  
              (
                        CJ.cjDatum < CURRENT_DATE - INTERVAL 14 DAY 
                AND
                        AED.aRegistratie > CURRENT_DATE - INTERVAL 10 YEAR
                ) 
              OR (CJ.aid is null)
              ) 


        OR
                ( 
                        CJ.cjStatus = '9' 
                OR 
                        CJ.cjStatus = '2'
                )
于 2013-04-19T08:57:39.157 回答