2015-10-20 158 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 –