【问题标题】:One-to-many query一对多查询
【发布时间】:2020-11-30 12:23:31
【问题描述】:

我有一个假设的数据库,如下图所示,每种植物最多可以有 4 种颜色。

我希望能够以类似于下面的格式返回我的结果。

如果我使用 Inner Join 运行标准查询,如果植物有不止一种颜色,结果会重复。因此,我尝试运行多个单独的查询,首先是返回植物,然后是返回颜色的新查询。然后我循环遍历颜色结果以产生我想要的输出。

我认为有很有效的方法可以实现这一目标?

我正在尝试将其作为查询和存储过程来执行,因此任何指针都将不胜感激。

【问题讨论】:

  • 优秀。这比我的解决方法更快更整洁。

标签: sql one-to-many sql-server-express


【解决方案1】:

如果你知道最多有 4 种颜色,那么你可以使用row_number() 和条件聚合:

select plantname,
       max(case when seqnum = 1 then colorname end) as color_1,
       max(case when seqnum = 2 then colorname end) as color_2,
       max(case when seqnum = 3 then colorname end) as color_3,
       max(case when seqnum = 4 then colorname end) as color_4
from (select p.plantname, p.plantid, c.colorname,
             row_number() over (partition by p.plantid order by c.colorid) as seqnum
      from plants p join
           plantcolors pc
           on pc.plantid = p.plantid join
           colors c
           on pc.colorid = c.colorid
     ) pc
group by plantname, plantid;

【讨论】:

  • 如果我想从植物表中返回多个植物名称,如何将其添加到上面来实现这一点?一些项目将来自查找表。
  • @StephenH 。 . .一种方法是列出SELECTGROUP BY 中的列。
  • 感谢您的及时回复。除了在 group by 中包含列引用之外,我所做的一切都是正确的。这很好用,只需要为查找表中包含的那些值包含一个连接。
  • 我刚刚注意到,如果输入的植物没有颜色,它不会返回颜色为 4 Null 的植物。有没有办法解决这个问题?
  • 感谢您对我的问题的回复和耐心。
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 2023-04-01
  • 2013-06-11
  • 2018-01-26
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多