单个 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
在这里,您将加入 tblcustomfieldsvalues
和 tblcustomfields
,最后一个加入 tblhosting
。查看ON
条件以确保它们正确连接。
最后,将WHERE
子句应用于您要约束的属性。
希望这会有所帮助!
【讨论】:
这可行,但由于某种原因,它返回多条记录,而不是 3 查询版本返回的单条记录 也许我忘记了什么。尝试将AND tblcustomfieldsvalues.relid = tblhosting.id
添加到最后一个INNER JOIN
子句(据我了解你的版本,你有它)。以上是关于单个 SQL 选择查询与单个大 SQLselect 查询:啥更好?为啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Android SQLite 性能:单个查询中的多个选择与多个查询中的单个选择?