单个 SQL 选择查询与单个大 SQLselect 查询:啥更好?为啥? [关闭]

Posted

技术标签:

【中文标题】单个 SQL 选择查询与单个大 SQLselect 查询:啥更好?为啥? [关闭]【英文标题】:individual SQL select queries vs single big SQLselect query: what is better & why? [closed]单个 SQL 选择查询与单个大 SQLselect 查询:什么更好?为什么? [关闭] 【发布时间】:2012-06-21 12:52:37 【问题描述】:

我有这三个单独的查询,这是它们的伪版本:

SELECT packageid from tblhosting where userid=1234 AND id=4351
SELECT id FROM tblcustomfields WHERE relid =tblhosting.packageid AND fieldname ='foo'
SELECT value FROM  `tblcustomfieldsvalues` WHERE  `fieldid` =tblcustomfields.id AND relid=tblhosting.id

目前,这些是单独的查询,它们显示为每个查询的子查询。将它们组合成单个查询是否有意义?如果是,那么为什么以及如何将其结合起来?

【问题讨论】:

取决于您实际想要的最终结果。 我只想要第三次查询的结果 这三个查询似乎彼此无关,因此将它们组合起来对我来说没有多大意义。 您应该使用INNER JOIN 并进行更大的查询。 您还应该提到它们目前显示为 SUB 查询。其实这还是没有意义的,只要给出你的实际查询... 【参考方案1】:

抱歉有点密集,但您的问题似乎没有使用子查询。

如果真正的代码使用子查询,按照

SELECT value 
FROM  `tblcustomfieldsvalues` 
WHERE  `fieldid` = 
   (SELECT id 
   FROM tblcustomfields 
   WHERE relid =(
     SELECT packageid 
     from tblhosting 
     where userid=1234 
     AND id=4351)
 AND fieldname ='foo')
AND relid=tblhosting.id

那么您只需将其与@Chopin 的版本进行比较,就可以看出从可读性的角度来看,连接要好得多。

联接也是执行此操作的惯用方式 - 大多数 SQL 开发人员在研究基于子查询的方法时会摸不着头脑;这使得它的可维护性和可扩展性降低。

就性能而言,我猜查询优化器会识别出它们是等价的; “更好”的版本可能没有任何改进。

【讨论】:

它说,'#1054 - 'where 子句'中的未知列'tblhosting.id' 对于哪个查询 - 我的例子,或者肖邦的努力应该有效?【参考方案2】:

查询可能是这样的:

SELECT value FROM tblcustomfieldsvalues
INNER JOIN tblcustomfields ON tblcustomfields.id = tblcustomfieldsvalues.fieldid
INNER JOIN tblhosting ON tblhosting.packageid = tblcustomfields.relid
WHERE tblcustomfields.fieldname = 'foo' AND tblhosting.userid = 1234 AND tblhosting.id = 4351

在这里,您将加入 tblcustomfieldsvaluestblcustomfields,最后一个加入 tblhosting。查看ON 条件以确保它们正确连接。

最后,将WHERE 子句应用于您要约束的属性。

希望这会有所帮助!

【讨论】:

这可行,但由于某种原因,它返回多条记录,而不是 3 查询版本返回的单条记录 也许我忘记了什么。尝试将AND tblcustomfieldsvalues.relid = tblhosting.id 添加到最后一个INNER JOIN 子句(据我了解你的版本,你有它)。

以上是关于单个 SQL 选择查询与单个大 SQLselect 查询:啥更好?为啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用单个 SQL 查询选择所有带有父评论的回复

如何编写基于组合框选择的单个 sql 查询?

SQL Join 与单个表的多行

Android SQLite 性能:单个查询中的多个选择与多个查询中的单个选择?

为啥选择单个属性返回的行数少于选择 Oracle SQL 中的所有列

我应该使用一个大的 SQL Select 语句还是几个小的 SQL Select 语句?