选择性SQL查询

时间:2015-10-20 07:48:56

标签: sql sql-server sql-server-2014

我有3个表,ItemsFileLinksFiles,其中每个项目可以有多个与之关联的文件。

项目有ItemID和ItemName。

FileLinks是包含ItemID和FileID的Items和Files之间的链接表。

文件包含FileID,FileURL和FileCategory。

我想要一个查询列出所有项目(没有重复项)和指定类别的单个文件的URL,如果没有该类别的文件,则在URL字段中显示空白。

我从这开始:

select items.itemid, items.itemname, files.url
from items
inner join filelinks on items.itemid = filelinks.itemid
inner join files on filelinks.fileid = files.fileid
where files.filecategory = 1

但是,只显示具有该类别文件的项目,如果每个项目有多个文件,则隐藏那些不重复项目列表的项目。我需要所有项目,只需要该类别中的单个文件或空白。

示例数据:

items
ItemID ItemName
1     apple
2     orange

filelinks
itemid fileid
1 1
1 2 
2 3
2 4

files
fileid category url
1     main apple.jpg
2     secondary apple2.jpg
3     main orange.jpg
4     secondary orange2.jpg

if category = main, then results should be

itemid itemname url
1      apple    apple.jpg
2      orange   orange.jpg

1 个答案:

答案 0 :(得分:2)

执行LEFT JOIN以获取没有任何文件链接或文件的项目:

select items.itemid, items.itemname, files.url
from items
left join filelinks on items.itemid = filelinks.itemid
left join files on filelinks.fileid = files.fileid
               and files.filecategory = 1

要仅为某个项目获取一个文件,请执行GROUP BY并选择MIN一个:

select items.itemid, items.itemname, MIN(files.url)
from items
left join filelinks on items.itemid = filelinks.itemid
left join files on filelinks.fileid = files.fileid
               and files.filecategory = 1
group by items.itemid, items.itemname