如何检查内部联接的结果是否为null

时间:2013-08-23 05:18:18

标签: mysql if-statement

我正在尝试使用内部联接加入4个表,其中一个使用别名“m”,为定义的条件返回空结果集(这是一种有效的可能性)。我想在我的IF语句中为空结果集做一个规定:

IF(((((SUM(m.TTL_ONLINE_COUNT)+SUM(m.TTL_OFFLINE_COUNT))*100))> TAV.`ThresholdValue`) OR ISNULL(m.TTL_ONLINE_COUNT)

目前,我正在尝试检查返回的数据集的列是否为null,但它不能按预期工作。我怎样才能做出这样的规定?

SELECT AQ.Adate, TE.EmployeeID, TE.`WorkerLevelID`,TAV.ManufacturingProductID,TAV.SubOfficeID,Te.SubstationCode,TAV.`AllowID`,TAV.`WorkerLevelID`,TAV.ThresholdValue,TAV.RewardValue,
CASE AQ.Status
     WHEN '0' OR '6' THEN
        IF(((((SUM(m.TTL_ONLINE_COUNT)+SUM(m.TTL_OFFLINE_COUNT))*100))> TAV.`ThresholdValue`) OR ISNULL(m.TTL_ONLINE_COUNT), 
            CASE TAV.RateType 
                WHEN 'Monthly' THEN 
                    TAV.RewardValue/DAY(LAST_DAY(P_DateFrom))


                WHEN 'Yearly' THEN
                    TAV.RewardValue/365.25


            END, 0)
END   AS FPYAllowance
FROM  TempEmployee TE
INNER JOIN TempAllowValid TAV ON TE.ManufacturingProductID = TAV.ManufacturingProductID       AND TE.SubOfficeID =TAV.SubOfficeID AND TE.WorkerLevelID = TAV.WorkerLevelID
INNER JOIN Attendance_QlikView AQ ON P_DateFrom = AQ.ADate
INNER JOIN `mwooriginbasedfault` m ON m.Defect_Origin_Code = TE.SubstationCode AND m.Defect_Date = AQ.ADate
WHERE (TAV.AllowID = 3 OR Tav.AllowID=10 )
GROUP BY AQ.Adate, TE.EmployeeID);

1 个答案:

答案 0 :(得分:0)

此处您需要将表格mleft join而不是inner join相关联。

inner join消除了表TE.EmployeeID中没有相应行的所有mleft join将保留所有TE.EmployeeID并填充表m的字段为空。

替换

INNER JOIN `mwooriginbasedfault` m ON 
    m.Defect_Origin_Code = TE.SubstationCode AND m.Defect_Date = AQ.ADate

通过

LEFT JOIN `mwooriginbasedfault` m ON 
    m.Defect_Origin_Code = TE.SubstationCode AND m.Defect_Date = AQ.ADate

您不需要在if子句中设置空结果集。小组函数sum()会为null值计算自己,并在计算总和时忽略它们。

相关问题