这对我来说很难解释所以如果需要进一步澄清,请随时告诉我。我有5张桌子:
每件艺术品可以有几种保险,但每件艺术品只能有一个有效展品(确定当前日期是否在展览的开始和结束日期之间)。我的问题是如何检索所有艺术作品行(包括所有艺术作品表的列),应用于该作品的所有保险(该艺术品逗号分隔的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
相同的行数,而且旧的展品也不会被过滤掉,保险名称也不会在同一个单元格中以逗号分隔。我已经对左连接做了一些阅读,但我不认为我正确地使用它们来完成我之后的事情。我已经在这方面工作了好几天,可以真正使用一些帮助。任何帮助赞赏。谢谢!
答案 0 :(得分:1)
首先获得逗号分隔保险。它可以通过多种方式完成。我使用过for xml
。但是还有其他方法可以使用pivot
或group + 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