无法找出一个简单的SQL查询

时间:2014-09-09 02:50:54

标签: sql database ms-access

可能很简单,但我现在已经挖了几天了......我只是无法弄清楚如何在Access中创建这个SQL查询...

参考下表,我正在寻找可以从特定GROUP(即1:工具)中提取特定商店(即1:Alpha)的所有ITEMS的查询2014年的报告......在这种情况下,ITEMS.IDs 6,8,9和10!

表:

Years
ID | Year
-----------------------------------------------
1 | 2014
2 | 2015

Shops
ID | ShopName
-----------------------------------------------
1 | Alpha
2 | Bravo

Items
ID | StockNbr | Description | GroupID
-----------------------------------------------
1 | 00-1200 | Ratchet 1/4 | 1
2 | 00-1201 | Ratchet 1/2 | 1
3 | 00-1300 | Screwdriver Philips No1 | 1
4 | 01-5544 | Banana | 2
5 | 00-4457 | Apple | 2
6 | 21-8887 | Hammer | 1
7 | 21-6585 | Drill | 1
8 | 21-4499 | Multimeter | 1
9 | 21-5687 | Digital Caliper | 1
10 | 22-7319 | File Set | 1
...

Groups
ID | GroupName
-----------------------------------------------
1 | Tools
2 | Fruits

REPORTS
ID | YearID | ShopID | ItemID
-----------------------------------------------
1 | 1 | 1 | 1
2 | 1 | 1 | 2
3 | 1 | 1 | 3
4 | 1 | 1 | 4
5 | 1 | 1 | 7
6 | 1 | 2 | 5
7 | 1 | 2 | 8
8 | 1 | 2 | 10

我已经尝试了这一点,但后来我意识到它并没有考虑商店,它会列出报告中没有列出的所有商品,所以如果报告中有商品的商品2,它不会列出它......

SELECT Items.ID, Items.StockNbr, Items.Description, Items.GroupID, Reports.YearID, Reports.ShopID
FROM Reports
  RIGHT JOIN Items ON Reports.ItemID = Items.ID
WHERE (((Items.GroupID)=1) AND ((Reports.UnitID) Is Null))
ORDER BY Items.StockNbr; 

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为你正在寻找反加入。有几种方法可以做到这一点。这是一个使用not in

select i.* from items i
where i.GroupId = 1
and i.ID NOT IN (
    select ItemID from reports r
    where r.ShopID = 1
    and r.YearID = 2014
)

答案 1 :(得分:0)

如果表Reports没有引用Items.ID,则没有可用的关系ShopID或YearID

select * 
from items
left join reports on items.id = reports.itemid
where reports.itemid IS NULL