SQL间歇性地不返回任何数据以响应LEFT JOIN

时间:2018-11-05 22:22:42

标签: mysql sql database join left-join

我正在尝试查找SQL查询中的错误,但似乎无法深入了解它。查询看起来像这样:

SELECT
    DATE(BT.DateCheckedIn) AS X,
    DAYOFWEEK(BT.DateCheckedIn) AS DayX,
    SUM(IR.QtyCheckedIn) AS C,
    AU.AdminUsername,
    AU.AdminFirstName,
    AU.AdminLastName,
    IF(BTE.ProdLogID IS NULL, 'No', 'Yes') AS Exclude
FROM
    buying_issuesreceived IR
    JOIN buying_transactions BT ON IR.TransactionID = BT.TransactionID
    JOIN adminusers AU ON BT.CheckedInByAdminUserID = AU.AdminUserID
    LEFT JOIN log_production_bt BTE
        ON DATE(BT.DateCheckedIn) = DATE(BTE.ProductionDate)
        AND BTE.ProductionSection = 'wtransactions'
        AND AU.AdminUsername = BTE.ProductionUsername
WHERE
    DATE(BT.DateCheckedIn) BETWEEN DATE  '2018-09-24' AND DATE  '2018-09-30'
GROUP BY
    DATE(BT.DateCheckedIn),
    AU.AdminUsername

运行此查询时,它有大约50/50的机会返回正确的数据或什么也不返回。没有错误信息。我知道,或者应该说,可以肯定的是,LEFT JOIN是罪魁祸首,因为当我从代码中删除它时,我不再获取空表,但是我一生都无法弄清楚为什么这个查询会首先返回不一致的结果。

1 个答案:

答案 0 :(得分:0)

这听起来像一个MySQL错误。解决方法是,您可以将EXISTS与相关的子查询一起使用。

SELECT
    DATE(BT.DateCheckedIn) AS X,
    DAYOFWEEK(BT.DateCheckedIn) AS DayX,
    SUM(IR.QtyCheckedIn) AS C,
    AU.AdminUsername,
    AU.AdminFirstName,
    AU.AdminLastName,    
    IF(EXISTS(
        SELECT 1
        FROM log_production_bt BTE
        WHERE 
            DATE(BT.DateCheckedIn) = DATE(BTE.ProductionDate)
            AND BTE.ProductionSection = 'wtransactions'
            AND AU.AdminUsername = BTE.ProductionUsername), 'NO', 'YES') AS Exclude
FROM
    buying_issuesreceived IR
    JOIN buying_transactions BT ON IR.TransactionID = BT.TransactionID
    JOIN adminusers AU ON BT.CheckedInByAdminUserID = AU.AdminUserID
WHERE
    DATE(BT.DateCheckedIn) BETWEEN DATE  '2018-09-24' AND DATE  '2018-09-30'
GROUP BY
    DATE(BT.DateCheckedIn),
    AU.AdminUsername