Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL的语法不可转换为联接?_Mysql_Sql - Fatal编程技术网

MySQL的语法不可转换为联接?

MySQL的语法不可转换为联接?,mysql,sql,Mysql,Sql,我有以下疑问: select full_name, email, users.uid from cloudsponge inner join `users` on users.uid = cloudsponge.importer_uid where cloudsponge.email not in (select mail from users) 它按预期工作,但我想知道,我是否可以将最后一行转换为联接(而不是子查询)。这会很有帮助,因为我可以使用我的ORM框架,而不是将SQL硬编码到应用程

我有以下疑问:

select full_name, email, users.uid
from
cloudsponge
inner join 
`users` on users.uid = cloudsponge.importer_uid
where cloudsponge.email not in (select mail from users)
它按预期工作,但我想知道,我是否可以将最后一行转换为联接(而不是子查询)。这会很有帮助,因为我可以使用我的ORM框架,而不是将SQL硬编码到应用程序中

谢谢

你可以写:

SELECT full_name, email, users.uid
  FROM cloudsponge
 INNER
  JOIN users
    ON users.uid = cloudsponge.importer_uid
  LEFT
  JOIN users AS users2
    ON cloudsponge.email = users2.mail
 WHERE users2.mail IS NULL
你可以写:

SELECT full_name, email, users.uid
  FROM cloudsponge
 INNER
  JOIN users
    ON users.uid = cloudsponge.importer_uid
  LEFT
  JOIN users AS users2
    ON cloudsponge.email = users2.mail
 WHERE users2.mail IS NULL

仅供参考:我无法告诉您原因,但两位不同的DBA告诉我,这不是好做法。我不知道这是否只是因为他们不喜欢这种风格,或者优化器不喜欢它,或者一些RDBMS不起作用。但是他们告诉我使用
不在
不存在
技术来代替。@JoeEnos:就个人而言,我不喜欢这种风格:
不在
不存在
表达了实际意图,而
左连接
+
为空
是一种将其表示为连接的黑客方式。但是如果您想知道为什么那些DBA反对它,您应该问问他们@JoeEnos,我已经看到两种解决方案都表现得更好,但这取决于很多因素,比如RDBMS优化器、扫描的数据量等。最好针对给定的情况测试两种解决方案。看看我的演讲。@ruakh当时我得到的答案是它“并不总是有效的”。我不相信这一点,至少在我们使用的系统(Oracle)中——我对它进行了几次测试,它总是完全符合我的预期。但我之所以听从他们的建议,是因为我同意你的风格。@BillKarwin看起来你在那些幻灯片中涵盖了很多好东西。我什么时候去看看。谢谢分享。仅供参考:我无法告诉您原因,但两位不同的DBA告诉我,这不是一个好做法。我不知道这是否只是因为他们不喜欢这种风格,或者优化器不喜欢它,或者一些RDBMS不起作用。但是他们告诉我使用
不在
不存在
技术来代替。@JoeEnos:就个人而言,我不喜欢这种风格:
不在
不存在
表达了实际意图,而
左连接
+
为空
是一种将其表示为连接的黑客方式。但是如果您想知道为什么那些DBA反对它,您应该问问他们@JoeEnos,我已经看到两种解决方案都表现得更好,但这取决于很多因素,比如RDBMS优化器、扫描的数据量等。最好针对给定的情况测试两种解决方案。看看我的演讲。@ruakh当时我得到的答案是它“并不总是有效的”。我不相信这一点,至少在我们使用的系统(Oracle)中——我对它进行了几次测试,它总是完全符合我的预期。但我之所以听从他们的建议,是因为我同意你的风格。@BillKarwin看起来你在那些幻灯片中涵盖了很多好东西。我什么时候去看看。谢谢分享。