【问题标题】:Most efficient way to SELECT and JOIN these tables选择和加入这些表的最有效方法
【发布时间】:2016-08-17 19:01:29
【问题描述】:

我有 4 张桌子:

表 1(组):

id_group  name_group
1         abc
2         def
3         ghi

表2(颜色):

id_color  name_color
1         blue
2         red
3         green

Table3(品种):

id_variety id_color id_group name_variety
1          1        1        light
2          3        1        dark
3          6        2        dark

Table4(音调):

id_tone id_color id_group name_tone
1          1      1       ocean
2          5      1       sea
3          9      3       clay

给定一个像 1 这样的 id_group,我想做一个选择,结果如下:

id_group id_color name_variety name_tone
1        1        light        ocean
1        3        dark         NULL
1        5        NULL         sea

我能够通过联合解决问题并更改 JOINS 的顺序,但我认为必须有另一种解决方案

SELECT 
    GRO.id_group, COL.id_color, VARI.name_variety, TONE.name_tone
FROM 
    groups GRO
LEFT OUTER JOIN 
    variety VARI ON  (VARI.id_group = GRO.id_group) 
LEFT OUTER JOIN 
    tone TONE ON (TONE.id_group = GRO.id_group) 
              AND (TONE.id_color = VARI.id_color)
LEFT OUTER JOIN 
    color COL ON (COL.id_color = VARI.id_color) 
              OR (COL.id_color = TONE.id_color)
WHERE 
    GRO.id_group = 1

UNION

SELECT 
    GRO.id_group, COL.id_color, VARI.name_variety, TONE.name_tone
FROM 
    groups GRO
LEFT OUTER JOIN 
    tone TONE ON (TONE.id_group = GRO.id_group)
LEFT OUTER JOIN 
    variety VARI ON  (VARI.id_group = GRO.id_group) 
                 AND (VARI .id_color = TONE.id_color)
LEFT OUTER JOIN 
    color COL ON (COL.id_color = VARI.id_color) 
              OR (COL.id_color = TONE.id_color)
WHERE 
    GRO.id_group = 1

【问题讨论】:

  • 您说您有三张桌子,但我认为组是第四张桌子。所以你有三四张桌子?
  • 你说得对,我有三个以上的表,但我猜没有必要显示组的表内容。不过我会编辑,谢谢!

标签: sql


【解决方案1】:

我认为你想要的更像是:

SELECT
    id_group,
    id_color,
    MAX(max_variety),
    MAX(max_tone)
FROM
    (SELECT 
        v.id_group, 
        v.id_color, 
        MAX(name_variety) AS max_variety, 
        MAX(name_tone) AS max_tone
    FROM 
        variety V   INNER JOIN 
        color c ON 
        V.id_color = c.id_color LEFT OUTER JOIN 
        tone t ON 
        t.id_group = v.id_group AND
        t.id_color = V.id_color
    WHERE 
        v.id_group = 1
    GROUP BY
        v.id_group, 
        v.id_color

    UNION ALL

    SELECT 
        t.id_group, 
        t.id_color, 
        MAX(name_variety) AS max_variety, 
        MAX(name_tone) AS max_tone
    FROM 
        tone t  INNER JOIN 
        color c ON 
        t.id_color = c.id_color LEFT OUTER JOIN 
        variety V ON 
        v.id_group = t.id_group AND
        v.id_color = t.id_color
    WHERE 
        t.id_group = 1
    GROUP BY
        t.id_group, 
        t.id_color) u
GROUP BY
    id_group,
    id_color

【讨论】:

    【解决方案2】:

    您可以使用全联接代替联合,因为全联接返回第一个表的所有结果以及第二个表的所有结果。

    选择 GRO.id_group、COL.id_color、VARI.name_variety、Tone.name_tone 来自 Variety VARI 在 col.id_color=VARI col.id 上加入颜色 COL 在 GRO.id_group=VARI.id_group 上加入 GRO 组 完全加入 Tone on Tone.id_group=GRO.id_group 其中 GRO.id_group = 1

    【讨论】:

    • 嗨,该代码将返回更多行重复 id_color 1 并且不显示 id_color 5 应该是 id_color 1、3、5就像我的例子一样。不管怎么说,还是要谢谢你! ^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多