1

我在 MySQL 中发现做连接时,我可以使用这个词AND来代替WHERE

SELECT * FROM `mySchema`.`tblOne`
LEFT JOIN `mySchema`.`tblTwo` ON `tblOne`.`FIELDX` = `tblTwo`.`FIELDY`
AND `FIELDZ` = 'FooBar';

这是一个错误还是有一个功能?在某些情况下这可能有用吗?

谢谢

4

4 回答 4

4

your ANDis 用于ON子句,这与子句无关WHERE

于 2012-07-03T14:29:50.280 回答
3

如果您查看JOIN( link ) 的文档,您会看到,在ON关键字之后有一个conditional_expr.

这与从句conditional_expr中使用的相同。WHERE所以基本上你可以在一个ON喜欢之后做同样的事情WHERE

之后,您还可以在那里使用ANDand OR、括号和所有其他条件运算符。

于 2012-07-03T14:32:14.440 回答
2

请注意, 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= tblTwoFIELDY,然后按`tblTwo.FIELDY = 'FooBar'过滤。它实际上与 INNER JOIN 相同。

于 2012-07-03T14:45:02.137 回答
0

这也适用于 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'
于 2012-07-03T14:32:52.273 回答