筛选编号查询,在Access数据库上左联接

时间:2019-01-05 13:24:42

标签: sql ms-access

这是场景。在此库存管理系统中,有项目。可以组合项目并制作组合项目。例如。显示器,系统单元,键盘,鼠标可以组成A1(组成项目)

当我将项目分配给Composed Item时,我使用了组合框来生成项目并选择项目。然后,我想将组合框的生成范围缩小到仅不在组合项目中的项目。 (例如,将鼠标m1分配给组成的项目A1。然后再次,我不想从组合框中看到它)我进行了以下不匹配的查询以过滤出项目。

SELECT Item.ITEMID, Item.SN, Item.TYPE, Item.BRAND,
       Item.LOCATION, Item.COMMENCEDDATE, Item.CONDEMNDATE,
       Type.TypeName
FROM Type INNER JOIN
     (Item LEFT JOIN
      ComposedIItem
      ON Item.[ITEMID] = ComposedIItem.[ITEMID]
     )
     ON Type.TYPEID = Item.TYPE
WHERE (((ComposedIItem.ITEMID) Is Null) XOR 
       (((ComposedIItem.ITEMID) Is Not Null) AND
       ((ComposedIItem.DETACHEDDATE) Is Not Null))
      );

当然,存在这样一种情况,即可以从合成项目中分离项目,然后再将其分配给合成项目。

在快照中,您可以找到我的工作方式。

在我将其从组合项目中分离出来并再次将其重新分配给另一项之前,该sql运行良好。然后,该项目仍会出现在组合框中。

有什么建议吗?

这里是数据集 https://imgur.com/a/EdRRbOx

1 个答案:

答案 0 :(得分:0)

如果您要Items不在任何个未组合的组合项目中,那么我在考虑not exists

select i.*, t.TypeName
from Item as i INNER JOIN
     Type as t
     on t.TYPEID = i.TYPE
where not exists (select 1
                  from ComposedIITem ci
                  where i.itemid = ci.itemid and
                        ci.detacheddate is null
                 );