SQL,检查行是否在另一个 Table
SQL, Check if Rows are in another Table
我有两个表,Stock
和 Warehouse
。
我需要获取所有仓库中可用的物品。
举个例子:
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
,因为与其他仓库不同,它在所有仓库中都可用。
我没有得到解决方案,有人可以帮助我吗?
select itemid
from stock
group by itemid
having count(distinct warehouseid) = (select count(*) from warehouse);
SQLFiddle: http://sqlfiddle.com/#!15/e4273/1
如果库存 table 也可能包含数量为 0 的项目,您需要添加一个 where 子句:
select itemid
from stock
where itemamount > 0
group by itemid
having count(distinct warehouseid) = (select count(*) from warehouse);
您也可以使用此 "double negative" 查询 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
- 空值没有问题
我使用这个查询:
SELECT
ItemID
FROM
stock
GROUP BY
ItemID
HAVING
SUM(DISTINCT warehouseid) = (SELECT SUM(WarehouseID) from warehouse)
这比使用 COUNT
更可靠,因为在不创建外键的极少数情况下,它应该 returns 一些无效结果。
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 distinct ItemID
替换为 select *
以获得所有这些项目。
我有两个表,Stock
和 Warehouse
。
我需要获取所有仓库中可用的物品。
举个例子:
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
,因为与其他仓库不同,它在所有仓库中都可用。
我没有得到解决方案,有人可以帮助我吗?
select itemid
from stock
group by itemid
having count(distinct warehouseid) = (select count(*) from warehouse);
SQLFiddle: http://sqlfiddle.com/#!15/e4273/1
如果库存 table 也可能包含数量为 0 的项目,您需要添加一个 where 子句:
select itemid
from stock
where itemamount > 0
group by itemid
having count(distinct warehouseid) = (select count(*) from warehouse);
您也可以使用此 "double negative" 查询 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
- 空值没有问题
我使用这个查询:
SELECT
ItemID
FROM
stock
GROUP BY
ItemID
HAVING
SUM(DISTINCT warehouseid) = (SELECT SUM(WarehouseID) from warehouse)
这比使用 COUNT
更可靠,因为在不创建外键的极少数情况下,它应该 returns 一些无效结果。
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 distinct ItemID
替换为 select *
以获得所有这些项目。