我对编写sql有点新意,我对连接有疑问。这是一个选择示例:
select bb.name from big_box bb, middle_box mb, little_box lb
where lb.color = 'green' and lb.parent_box = mb and mb.parent_box = bb;
所以,让我们说我正在寻找所有嵌入其中某个地方的大盒子的名字,这个盒子是绿色的。如果我理解正确,上面的语法是使用'join'关键字获得相同结果的另一种方法。
问题:上面的select语句对于它正在执行的任务是否有效?如果没有,有什么更好的方法呢?是连接的语句语法糖还是实际上正在做其他事情?
如果你有关于这个主题的任何好材料的链接,我很乐意阅读它,但由于我不知道这种技术到底是什么,我在谷歌上搜索它。
答案 0 :(得分:12)
您正在使用隐式连接语法。这相当于使用JOIN关键字,但最好完全避免使用此语法,而是使用显式连接:
SELECT bb.name
FROM big_box bb
JOIN middle_box mb ON mb.parent_box = bb.id
JOIN little_box lb ON lb.parent_box = mb.id
WHERE lb.color = 'green'
您还在连接条件中缺少列名。我猜这个列叫做id
。
如果表格索引正确,则此类查询应该有效。特别是在连接条件上应该有外键约束,在little_box.color
上有索引。
您的查询存在的问题是,如果单个框中有多个绿色框,则会返回重复的行。可以通过在SELECT之后添加DISTINCT来删除这些重复项。