2015-10-20 156 views
0

我有3个表,ItemsFileLinksFiles,每个项目可以有多个与之相关的文件。选择SQL查询

项目具有项目ID和ITEMNAME。

FileLinks是含有项ID和写到FileID项目和文件之间的链接表。

文件有写到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 
+0

SQL Server 2014,tag added –

+1

提供样品数据和预期结果。 –

+0

尝试使用LEFT JOIN,而不是内部联接。 – jarlh

回答

2

待办事项LEFT JOIN的也得到了没有任何filelinks或文件项:

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 one:

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 
+0

我认为这就是了,谢谢@jarlh –