SQL,检查行是否在另一个表中

Cyb*_*ebi 2 sql sql-server ssms

我有两张桌子,StockWarehouse.

我需要获得所有仓库中可用的物品.

这是一个例子:

Stock Table:

ItemID        WarehouseID        ItemAmount
-------------------------------------------
1043               1                20
1043               2                2
1043               3                16
1043               4                17
1044               1                32
1044               2                12
1044               4                7
1055               2                6
Run Code Online (Sandbox Code Playgroud)

 

Warehouse Table:

WarehouseID       WarehouseName
-------------------------------
1                 Name1
2                 Name2
3                 Name3
4                 Name4
Run Code Online (Sandbox Code Playgroud)

对于示例,结果应该是Item,1043因为它在所有仓库中都可用,与其他仓库不同.

我没有得到解决方案,任何人都可以帮助我吗?

Tim*_*ter 5

你也可以使用这个"双阴性"查询NOT EXISTS:

SELECT DISTINCT s.ItemID
FROM StockTable s
WHERE NOT EXISTS
(
    SELECT 1 FROM Warehouse w 
    WHERE NOT EXISTS(SELECT 1 FROM StockTable s2 
                     WHERE w.WarehouseID = s2.WarehouseID
                     AND   s.ItemID = s2.ItemID)
)
Run Code Online (Sandbox Code Playgroud)

Demo fiddle

这种方法看起来更冗长,但它有一些好处:

  • 如果规则越来越复杂,您可以轻松更改它
  • 您可以删除DISTINCT以查看所有行
  • 您可以添加所有列,因为GROUP BY未使用
  • 它没有null值的问题