【问题标题】:What query approach I can take to get data from 2 master and 1 master details table in SQL?我可以采取什么查询方法从 SQL 中的 2 个主表和 1 个主详细信息表中获取数据?
【发布时间】:2020-08-16 22:19:13
【问题描述】:

我有 3 个表 People、Distribution、DistributionPeopleDetails 如下:

我想检索人们获得上一次帮助的时间以及他们应该获得下一次帮助的时间。

我尝试以不同的方式连接三个表,但没有给我预期的结果,我对 SQL 不太熟悉,所以可能我只是在考虑基本连接,而它可能需要一些高级技巧,如 group by 等. 有人可以指导我吗?

到目前为止我已经尝试过了:

select top 1 P.Name, d.DistributionDate as 'Next Scheduled Help'

from Peoples p left join [dbo].[DistributionPeopleDetails] dp on p.Id = 
dp.PeopleId
left join [dbo].[Distributions] d on dp.DistributionId = d.Id
where d.DistributionDate > GetDate() order by d.Id



select top 1 P.Name, d.DistributionDate as 'LastScheduled Help'

from Peoples p left join [dbo].[DistributionPeopleDetails] dp on p.Id = 
dp.PeopleId
left join [dbo].[Distributions] d on dp.DistributionId = d.Id
where d.DistributionDate < GetDate() order by d.Id

我得到了我的预期结果,但我无法将这个 sn-p 查询放入我的 SP 中,我通过加入几个其他表来读取 People 的所有属性。

我得到/想要得到什么:

【问题讨论】:

  • 请向我们展示您期望的结果。它还有助于以表格文本而不是图像的形式提供您的数据,并为您的表格命名。
  • “我尝试以不同的方式连接三个表,但没有给我预期的结果” 向我们展示该尝试,向我们解释为什么它不起作用。跨度>
  • 用我试过的代码更新了问题。

标签: sql sql-server database tsql join


【解决方案1】:

您是否正在寻找连接和条件聚合,像这样?

select
    p.peopleId,
    p.name,
    max(case when d.distributionDate < getdate() then distributionDate end) lastDistibutionDate,
    min(case when d.distributionDate > getdate() then distributionDate end) nextDistibutionDate
from people p
left join distributionPeople dp on dp.peopleId = p.peopleId
left join distribution d on d.distributionId = dp.distributionId
group by p.peopleId, p.name

这为您在people 中的每行提供一条记录,其中lastDistibutionDate 列包含最近的过去distributionDate,而nextDistibutionDate 列是最接近的下一个distributionDate

【讨论】:

  • 我试了一下,看来这就是我想要的。我会花一些时间来理解您分享的问题并标记您的答案。谢谢。
  • 谢谢,我使用您的查询返回了一个集合,我再次加入了 Peoples 表以获得我需要的一切。 :)
猜你喜欢
  • 1970-01-01
  • 2018-04-30
  • 2022-01-17
  • 2021-07-16
  • 2020-08-28
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多