WHERE 子句中左联接的行为
在 SQL 中,左联接旨在包含左表中的所有行,即使存在右表中没有匹配的行。但是,某些条件可以改变此默认行为。
考虑以下查询:
SELECT a.foo, b.bar, c.foobar FROM tableOne AS a INNER JOIN tableTwo AS b ON a.pk = b.fk LEFT JOIN tableThree AS c ON b.pk = c.fk WHERE a.foo = 'something' AND c.foobar = 'somethingelse'
在此查询中,tableTwo 和 tableThree 之间的左联接实际上被转换为内联接,因为WHERE 子句中的条件 c.foobar = 'somethingelse'。这是因为在 WHERE 子句中从左联接的右侧指定非 NULL 值(此处为“somethingelse”)会消除相应列为 NULL 的任何行,从而导致内联接行为。
因此,查询仅返回 tableOne 和 tableTwo 中与 tableThree 中具有非 NULL 值 c.foobar 的行相匹配的行。要保持所需的左连接行为,请考虑以下解决方案:
1.在 WHERE 子句中包含 NULL:
将条件 c.foobar = 'somethingelse' 替换为 AND (c.foobar = 'somethingelse' OR c.foobar IS NULL) 以包含 foobar 为 ' 的行其他'或 NULL。
2.将条件移动到连接谓词:
将 c.foobar = 'somethingelse' 条件从 WHERE 子句移动到连接谓词:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
通过这样做,查询保留左连接行为,同时仍然根据 c.foobar 的值过滤掉行。
以上是WHERE 子句如何影响 SQL 中 LEFT JOIN 的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!