我认为这两个问题是相同的。但结果结果显示第一个查询的约束从四个AND开始工作,返回左连接的许多错误行。第二个查询中的结果看起来是正确的。 谁能解释这两个查询之间有什么区别? 这个问题与this one类似,但我100%确定结果不同。
SELECT uinfo.serial_number, uinfo.firmware, upd.objtype, upd.category
FROM UnitInfo uinfo
LEFT JOIN
UnitUpdateInfo upd
ON uinfo.serial_number = upd.serial_number
AND substring(uinfo.serial_number,1,2) NOT IN ('AB','CD','EF','GH')
AND substring(uinfo.serial_number,1,1) NOT LIKE 'M%'
AND upd.objtype ='HEEN'
AND TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(uinfo.firmware, '-', -2), '-', 1)) LIKE '3.0%'
SELECT uinfo.serial_number, uinfo.firmware, upd.objtype, upd.category
FROM UnitInfo uinfo
LEFT JOIN
UnitUpdateInfo upd
ON uinfo.serial_number = upd.serial_number
WHERE substring(uinfo.serial_number,1,2) NOT IN ('AB','CD','EF','GH')
AND substring(uinfo.serial_number,1,1) NOT LIKE 'M%'
AND upd.objtype ='HEEN'
AND TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(uinfo.firmware, '-', -2), '-', 1)) LIKE '3.0%'
[编辑]
第二个查询与:
SELECT uinfo.serial_number, uinfo.firmware, upd.objtype, upd.category
FROM UnitInfo uinfo
INNER JOIN
UnitUpdateInfo upd
ON uinfo.serial_number = upd.serial_number
WHERE substring(uinfo.serial_number,1,2) NOT IN ('AB','CD','EF','GH')
AND substring(uinfo.serial_number,1,1) NOT LIKE 'M%'
AND upd.objtype ='HEEN'
AND TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(uinfo.firmware, '-', -2), '-', 1)) LIKE '3.0%'
答案 0 :(得分:2)
只要LEFT JOIN
中的右侧表格中的字段与在WHERE
子句中,它实际上变为INNER JOIN
- 在您的查询中,您强制objtype
的{{1}}字段为非NULL =>连接必须成功。
第一个查询,将所有连接逻辑作为UnitUpdateInfo
的一部分,将包括第一个表中连接到第二个表中的那些行的所有行 - 其中第二个表字段为NULL,其中连接为'可能。
第二个查询将不包含第一个表中未加入第二个的那些行。