MS-ACCESS / SQL-如何在多个条件下应用where子句

问题描述 投票:1回答:2
SELECT Stock.*
FROM Stock
WHERE (
(
(Stock.ComputerPartNumber) In (SELECT [ComputerPartNumber] FROM [Stock] As Tmp GROUP BY [ComputerPartNumber] HAVING Count(*)=2)
) 
AND 
(
(Stock.EquipmentName)="EquipmentA" Or (Stock.EquipmentName)="EquipmentB")
) 
OR (
(
(Stock.ComputerPartNumber) In (SELECT [ComputerPartNumber] FROM [Stock] As Tmp GROUP BY [ComputerPartNumber] HAVING Count(*)=1)
) 
AND (
(Stock.EquipmentName)="EquipmentA" Or (Stock.EquipmentName)="EquipmentB"
)
);

我正在使用上面的SQL实现以下3个项目:-

  1. 仅找出设备A和/或设备B使用的所有计算机部件号
  2. 如果设备A和设备B以外的设备使用了ComputerPartNumber,则过滤查询结果。
  3. 如果如果EquipmentA和EquipmentC都使用ComputerPartNumber,则还要过滤出结果。

但是项目3无法成功滤出。我应该怎么做才能达到item3?表和查询快照已附加。预先感谢!

Table

Query

sql ms-access
2个回答
0
投票

[您需要做的是检查零件在所有设备中的使用总次数是否等于设备A或B使用零件的总次数:

SELECT S.StorageID, S.ComputerPartNumber, S.EquipmentName, S.Result
FROM Stock AS S
WHERE 
(SELECT COUNT(*) FROM Stock AS S1 WHERE S1.ComputerPartNumber=S.ComputerPartNumber)
=(SELECT COUNT(*) FROM Stock AS S2 WHERE S2.ComputerPartNumber=S.ComputerPartNumber AND S2.EquipmentName IN("EquipmentA","EquipmentB"))

问候,


0
投票

您可以使用not exists

select s.*
from stock as s
where not exists (select 1
                  from stock as s2
                  where s2.ComputerPartNumber = s.ComputerPartNumber and
                        s2.EquipmentName not in ("EquipmentA", "EquipmentB")
                 );
© www.soinside.com 2019 - 2024. All rights reserved.