简体   繁体   English

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

[英]SQL is intermittently returning no data in response to a LEFT JOIN

I am trying to hunt down a bug in a SQL query but can't seem to get to the bottom of it. 我正在尝试查找SQL查询中的错误,但似乎无法深入了解它。 The query looks like this: 查询如下所示:

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

When this query is run, it has about a 50/50 chance of returning the correct data or returning nothing at all. 运行此查询时,它有大约50/50的机会返回正确的数据或什么也不返回。 There is no error message. 没有错误信息。 I know, or rather should say, am pretty certain, that the LEFT JOIN is the culprit because when I delete it from the code I stop getting empty tables, but can't, for the life of me, figure out why this query would return inconsistent results in the first place. 我知道,或者应该说,可以肯定的是,LEFT JOIN是罪魁祸首,因为当我从代码中删除它时,我不再获取空表,但是我一生都无法弄清楚为什么这个查询会首先返回不一致的结果。

This sounds like a MySQL bug. 这听起来像一个MySQL错误。 As a workaround, you can use EXISTS with a correlated subquery. 解决方法是,可以将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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM