SQL Server 2014通过两个关系表获取行,以使用主表中的id分隔表

时间:2018-01-29 04:09:33

标签: sql-server sql-server-2014

这对我来说很难解释所以如果需要进一步澄清,请随时告诉我。我有5张桌子:

  • 艺术品{artwork_id,artwork_title,artwork_artist_id}
  • Artwork_Insurance {artwork_id,insurance_id}
  • 保险{insurance_id,insurance_name}
  • Artwork_Exhibit {artwork_id,exhibit_id}
  • 展览{exhibit_id,exhibit_name,exhibit_start_date,exhibit_end_date}

每件艺术品可以有几种保险,但每件艺术品只能有一个有效展品(确定当前日期是否在展览的开始和结束日期之间)。我的问题是如何检索所有艺术作品行(包括所有艺术作品表的列),应用于该作品的所有保险(该艺术品逗号分隔的insurance_name列中的值)以及该艺术作品的exhibit_name如果一个当前处于活动状态,则返回null值。

我的SQL知识非常有限,而且我希望实现的很多东西都没有被刷新,但到目前为止我还有:

select distinct 
    dbo.Artwork.artwork_id, 
    dbo.Artwork.artwork_title,
    dbo.Artwork.artwork_artist_id,
    dbo.Insurance.insurance_name, 
    dbo.Exhibit.exhibit_name
from
    dbo.Artwork_Insurance
left join 
    dbo.Artwork on dbo.Artwork_Insurance.artwork_id = dbo.Artwork.artwork_id
left join 
    dbo.Insurance on dbo.Insurance.insurance_id = dbo.Artwork_Insurance.insurance_id
left join 
    dbo.Artwork_Exhibit on dbo.Artwork_Exhibit.artwork_id = dbo.Artwork.artwork_id
left join 
    dbo.Exhibit on dbo.Exhibit.exhibit_id = dbo.Artwork_Exhibit.exhibit_id;

但是,这不仅会返回与运行select * from dbo.Artwork相同的行数,而且旧的展品也不会被过滤掉,保险名称也不会在同一个单元格中以逗号分隔。我已经对左连接做了一些阅读,但我不认为我正确地使用它们来完成我之后的事情。我已经在这方面工作了好几天,可以真正使用一些帮助。任何帮助赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

首先获得逗号分隔保险。它可以通过多种方式完成。我使用过for xml。但是还有其他方法可以使用pivotgroup + case。然后加入其他表。我没有检查查询,但它应该正常工作并返回您的预期输出

with cte_insurance as (
    select
        distinct Artwork_Insurance.artwork_id, stuff((
            select
                ', ' + Insurance.insurance_name
            from
                Insurance
            where
                Insurance.insurance_id = Artwork_Insurance.insurance_id
        ), 1, 2, '') insurance_name
    from
        Artwork_Insurance
)

select
    Artwork.artwork_id, Artwork.artwork_title, Artwork.artwork_artist_id
    , cte_insurance.insurance_name, Exhibit.exhibit_name
from
    Artwork
    left join cte_insurance on Artwork.artwork_id = cte_insurance.artwork_id
    left join Artwork_Exhibit on Artwork.artwork_id = Artwork_Exhibit.artwork_id
    left join Exhibit 
        on Artwork_Exhibit.exhibit_id = Exhibit.exhibit_id 
            and getdate() between Exhibit.exhibit_start_date and Exhibit.exhibit_end_date