我在 MySQL 中发现做连接时,我可以使用这个词AND
来代替WHERE
:
SELECT * FROM `mySchema`.`tblOne`
LEFT JOIN `mySchema`.`tblTwo` ON `tblOne`.`FIELDX` = `tblTwo`.`FIELDY`
AND `FIELDZ` = 'FooBar';
这是一个错误还是有一个功能?在某些情况下这可能有用吗?
谢谢
我在 MySQL 中发现做连接时,我可以使用这个词AND
来代替WHERE
:
SELECT * FROM `mySchema`.`tblOne`
LEFT JOIN `mySchema`.`tblTwo` ON `tblOne`.`FIELDX` = `tblTwo`.`FIELDY`
AND `FIELDZ` = 'FooBar';
这是一个错误还是有一个功能?在某些情况下这可能有用吗?
谢谢
your AND
is 用于ON
子句,这与子句无关WHERE
。
如果您查看JOIN
( link ) 的文档,您会看到,在ON
关键字之后有一个conditional_expr
.
这与从句conditional_expr
中使用的相同。WHERE
所以基本上你可以在一个ON
喜欢之后做同样的事情WHERE
。
之后,您还可以在那里使用AND
and OR
、括号和所有其他条件运算符。
请注意, usingON ... AND ...
可以给出不同的结果ON ... WHERE
:
SELECT * FROM `mySchema`.`tblOne`
LEFT JOIN `mySchema`.`tblTwo` ON `tblOne`.`FIELDX` = `tblTwo`.`FIELDY`
AND `FIELDZ` = 'FooBar';
如果 FIELDZ 在 tblTwo 中(从上面不清楚),这将返回 tblTwo 中的所有行tblOne
,并连接 tblTwo 中的匹配行(即具有 FIELDY = tblOne.FIELDX 和 FIELDZ = 'FooBar' 的行)
SELECT * FROM `mySchema`.`tblOne`
LEFT JOIN `mySchema`.`tblTwo` ON `tblOne`.`FIELDX` = `tblTwo`.`FIELDY`
WHERE `FIELDZ` = 'FooBar';
如果 FIELDZ 在 tblTwo 中,这将加入tblOne
. FIELDX
= tblTwo
。FIELDY
,然后按`tblTwo.FIELDY = 'FooBar'过滤。它实际上与 INNER JOIN 相同。
这也适用于 SQL Server 2008。我不明白这将是一个错误。JOIN 的“ON”部分类似于“WHERE”。基本上你的查询说的是:
WHERE tblOne.FIELDX = tblTwo.FIELDY AND FIELDZ = 'FooBar';
你可以使用:
ON FIELDX = FIELDY AND FIELDZ = 'FooBar'
或者:
ON FIELDX = FIELDY
WHERE FIELDZ = 'FooBar'