回答

收藏

sql连接语法

技术问答 技术问答 176 人阅读 | 0 人回复 | 2023-09-13

我对编写sql很陌生,并且对联接有疑问。这是一个示例选择:
, t7 h1 ^; |) _/ a$ N6 V# tselect bb.name from big_box bb, middle_box mb, little_box lb! [0 ?9 V7 Y9 L+ a
where lb.color = 'green' and lb.parent_box = mb and mb.parent_box = bb;
: C( S$ t$ M$ h/ Y" R因此,假设我正在寻找所有嵌套在其中某个绿色小盒子的大盒子的名称。如果我理解正确,上述语法是获得与使用’join’关键字可获得的结果相同的另一种方法。
' o; [9 b; N1 S2 D9 r7 h, ^问题:上面的select语句对于正在执行的任务有效吗?如果没有,有什么更好的方法呢?语句是联接的语法糖还是它实际上在做其他事情?# D4 r) N; W; I6 q
如果您有任何与该主题相关的好材料的链接,我会很乐意阅读,但是由于我不确切知道该技术叫什么,因此无法进行谷歌搜索。
% l! c2 J# \* c, O                3 u9 F* ~7 E3 A# ]7 r
解决方案:
  c, f$ b, k' {  |                - U7 v+ ]; k; L. a
3 E& Y- F- |( Z. _2 c  v+ l

' o: z8 m6 o4 K" S9 G                您正在使用隐式连接语法。这等效于使用JOIN关键字,但是最好完全避免使用此语法,而应使用显式联接:; u! s8 y1 M0 p3 ~* r
SELECT bb.name' S" u% J5 ]6 |1 U6 {* k; Q% r
FROM big_box bb& }' Z# B6 }+ B2 b
JOIN middle_box mb ON mb.parent_box = bb.id
7 v, O& O0 J$ S/ S: u4 n" cJOIN little_box lb ON lb.parent_box = mb.id
, e3 a& h0 c2 s" EWHERE lb.color = 'green'; X9 G& h4 b9 E' \8 Y( k4 Z% h
您还缺少联接条件中的列名。我猜该列称为id。
2 J0 }5 o* B0 Z& k8 S! Z) ^如果对表进行正确索引,则这种类型的查询应该很有效。特别是在连接条件上应有外键约束,并在上有一个索引little_box.color。: o& E* C( W" u* o8 h: Q% [
您的查询存在一个问题,即如果一个框内有多个绿色框,则会返回重复的行。通过在SELECT之后添加DISTINCT可以删除这些重复项。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则