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

标签 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

Warehouse Table:

WarehouseID       WarehouseName
-------------------------------
1                 Name1
2                 Name2
3                 Name3
4                 Name4

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

我没有找到解决方案,有人可以帮助我吗?

最佳答案

您还可以使用 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)
)

Demo fiddle

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

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

关于SQL,检查行是否在另一个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30370127/

相关文章:

mysql - 选择查询到一列列表中

java - 按另一个表中的最大值或最小值排序

sql - 根据列值从现有表生成新的临时表

sql - 如何用下一行的值替换空值

事件的 SQL 频率

sql - 为什么当我创建已经存在的表时,SAS、Proc SQL 不会抛出错误

sql - 俄语、德语和阿拉伯语使用哪种排序规则

Java:当记录存在时=继续向记录末尾添加数字

mysql - 尝试进行 LEFT JOIN,但最终得到空结果

sql-server - Microsoft Azure SQL 数据库跟踪重播