繁体   English   中英

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

[英]SQL, Check if Rows are in another Table

我有两张桌子, 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)
)

演示小提琴

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

  • 如果规则越来越复杂,您可以轻松更改它
  • 您可以删除DISTINCT以查看所有行
  • 您可以添加所有列,因为未使用GROUP BY
  • 它没有null值的问题
select itemid
from stock
group by itemid
having count(distinct warehouseid) = (select count(*) from warehouse);

SQLFiddle: http ://sqlfiddle.com/#!15 / e4273 / 1

如果stock表还可能包含amount = 0的项,则需要添加where子句:

select itemid
from stock
where itemamount > 0
group by itemid
having count(distinct warehouseid) = (select count(*) from warehouse);

NOT EXISTS结合EXCEPT

select distinct ItemID
from stock s1
where not exists (select warehouseid from warehouse
                  except 
                  select warehouseid from stock s2 where s2.ItemID = s1.ItemID);

您甚至可以用select *替换select distinct ItemID来获取所有这些项目。

我用这个查询:

SELECT 
    ItemID
FROM 
    stock
GROUP BY 
    ItemID
HAVING 
    SUM(DISTINCT warehouseid) = (SELECT SUM(WarehouseID) from warehouse)

这比使用COUNT更可靠,因为在极少数情况下不使用外键它应该返回一些无效结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM